У меня есть трехуровневая вложенная модель класса case с кучей опций, которая представляет некоторые данные в базе данных. Это по существу:
case class User(settings: Option[Settings])
case class Settings(keys: Option[List[KeySet]])
case class KeySet(privateKey: String, publicKey: String)
Я понимаю, как получить из этого глубоко вложенные поля, используя некоторые для понимания или цепочки flatMap
(объект Scala Option внутри другого объекта Option), и я также понимаю, как обновлять его с помощью библиотеки объективов, но я хочу выяснить, как обновлять поля, даже если некоторые элементы в дереве None
и автоматически Some
из них, если они еще не существуют.
Например, как мне поступить в случае, когда я хочу добавить в список keys
, но пользователь еще не установил ни одного settings
? Можно ли в каком-то смысле автоматически создать поле Some(settings)
, а также поле Some(keys)
?
У меня есть идея, как это сделать с большим количеством сопоставлений с образцом, но это кажется неправильным из-за 1. смещения кода вправо и 2. нечастого использования map
или flatMap
с параметрами.
Возможно ли это с помощью отдельной библиотеки объективов? Я прочитал здесь, что это может быть невозможно: https://github.com/julien-truffaut/Monocle/issues/215, как и в случае с Monocle, он не может обновить Option
, который является None
. Может быть, мне нужно подумать о проблеме с другой стороны?
Спасибо