/// <summary> /// Describes an optional object field. /// </summary> public static Codec <JToken, Pair <TPrev, Option <TProp> >, T> Optional <T, TPrev, TProp>( this Codec <JToken, TPrev, T> codec, string fieldName, Func <T, Option <TProp> > getter, Codec <JToken, TProp> fieldCodec) => CreateFree( codec.Decoder.Optional(fieldName, fieldCodec.Decoder), Encoder.Divide <JToken, T, T, Option <TProp> >( JsonUtil.Append, x => Pair.Create(x, getter(x)), codec.Encoder, JsonEncoder.Property(fieldName, JsonEncoder.Nullable(fieldCodec.Encoder))) );
/// <summary> /// Describes a required object field. /// </summary> public static Codec <JToken, Pair <TPrev, TProp>, T> Required <T, TPrev, TProp>( this Codec <JToken, TPrev, T> codec, string fieldName, Func <T, TProp> getter, Codec <JToken, TProp> fieldCodec) => CreateFree( codec.Decoder.Required(fieldName, fieldCodec.Decoder), Encoder.Divide <JToken, T, T, TProp>( JsonUtil.Append, x => Pair.Create(x, getter(x)), codec.Encoder, JsonEncoder.Property(fieldName, fieldCodec.Encoder)) );
/// <summary> /// Codec for arrays. /// </summary> public static Codec <JToken, IEnumerable <T> > Array <T>(Codec <JToken, T> elementCodec) => Create(JsonDecoder.Array(elementCodec.Decoder), JsonEncoder.Array(elementCodec.Encoder));
/// <summary> /// Codec for optional values. /// </summary> public static Codec <JToken, Option <T> > Nullable <T>(Codec <JToken, T> valueCodec) => Create(JsonDecoder.Nullable(valueCodec.Decoder), JsonEncoder.Nullable(valueCodec.Encoder));