scala 3 を使っていて、いい感じにコードを書くことができたので、ここにメモ。
CSVから値を読み込んで直積型に変換する処理を実装していた。
登場する型はRecipeとRecipeRecord。
CSVから読み込んだデータはRecipeRecordで表現されているので、それをRecipeに変換する。
case class RecipeRecord(name: String, description: String) def convertToRecipe(recipeRecord: RecipeRecord): Either[String, Recipe] = for { _ <- validateRecipeName(recipeRecord.name) _ <- validateRecipeDescription(recipeRecord.description) recipe = Recipe(recipeRecord.name, recipeRecord.description) } yield recipe
変換をする時に、バリデーションを行う。
バリデーションで失敗すると、EitherのLeft[String]が返るようにしている。一方で、バリデーションが成功すればRight[Unit]が返る。
これをfor内包表記で使うことで、一連の処理をつなげて書くことができた。for内包表記のおかげで短絡も実現できたので、バリデーションが失敗すると関数全体の戻り値はLeft[String]になる。バリデーションが成功すればRithg[Recipe]が返される。
クライアントコードは変換に成功すればRecipe型を、失敗すれば原因を表す文字列を受け取ることができる。