すべてのメソッドが同じEither[Error、Result]を返す、ある種の「メソッド呼び出しチェーン」を作成できるかどうかを知りたいのですが。
私がやりたいのは、すべてのメソッドを連続して呼び出し、メソッドがLeft(Error)を返したら、メソッド呼び出しを停止して、呼び出しチェーンで見つかった最初のLeftを返すことです。
折り畳み、地図、投影法など、いくつか試してみましたが、Scalaは初めてで、エレガントな解決策は見つかりません。
私はそのようなことを試みました:
def createUserAndMandatoryCategories(user: User) : Either[Error,User] = {
User.create(user).right.map {
Logger.info("User created")
Category.create( Category.buildRootCategory(user) ).right.map {
Logger.info("Root category created")
Category.create( Category.buildInboxCategory(user) ).right.map {
Logger.info("Inbox category created")
Category.create( Category.buildPeopleCategory(user) ).right.map {
Logger.info("People category created")
Category.create( Category.buildTrashCategory(user) ).right.map {
Logger.info("Trash category created")
Logger.info("All categories successfully created created")
Right(user)
}
}
}
}
}
}
しかし、それは機能しません。そしてとにかく、私はそれが取るインデントが本当に好きではありません。さらに、エラーを問題を説明する新しい文字列に変換したいと思います(foldを使用する必要があると思いますか?)
私はそのように書かれたものを探しています:
val result : Either[String,CallResult] = call1.something("error 1 description")
.call2.something("error 2 description")
.call3.something("error 3 description")
.call4.something("error 4 description")
Scalaでそのようなことをすることは可能ですか?おそらくEitherとOptionの両方を使用していますか?
また、最初の呼び出しが失敗した場合、他の呼び出しを行わないようにするという制約もあります。すべてを呼び出してからどちらかに参加するソリューションは必要ありません。
ありがとう!