on master help sign in
Update: optionality usability
891829cDenis Redozubov
src/Data/Schematic/JsonSchema.hs+7
@@ -12,8 +12,10 @@ import Control.Monad.State.Strict
12import Data.Aeson as J
12import Data.Aeson as J
13import Data.Foldable as F
13import Data.Foldable as F
14import Data.HashMap.Strict as H
14import Data.HashMap.Strict as H
15+import Data.List as L
15import Data.List.NonEmpty as NE
16import Data.List.NonEmpty as NE
16import Data.Schematic.Schema as S
17import Data.Schematic.Schema as S
18+import Data.Set as Set
17import Data.Singletons
19import Data.Singletons
18import Data.Text
20import Data.Text
19import Data.Traversable
21import Data.Traversable
@@ -84,8 +86,13 @@ toJsonSchema' = \case
84 res <- for objs $ \(n,s) -> do
86 res <- for objs $ \(n,s) -> do
85 s' <- toJsonSchema' s
87 s' <- toJsonSchema' s
86 pure (n, s')
88 pure (n, s')
89+ let
90+ nonOpt = \case
91+ (_, DSchemaOptional _) -> False
92+ _ -> True
87 pure $ emptySchema
93 pure $ emptySchema
88 { _schemaType = pure $ TypeValidatorString D4.SchemaObject
94 { _schemaType = pure $ TypeValidatorString D4.SchemaObject
95+ , _schemaRequired = pure $ Set.fromList $ fst <$> L.filter nonOpt objs
89 , _schemaProperties = pure $ H.fromList res }
96 , _schemaProperties = pure $ H.fromList res }
90 DSchemaArray acs sch -> do
97 DSchemaArray acs sch -> do
91 res <- toJsonSchema' sch
98 res <- toJsonSchema' sch
src/Data/Schematic/Schema.hs+1−1
@@ -472,7 +472,7 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
472 Nothing -> fail "schemaobject"
472 Nothing -> fail "schemaobject"
473 SSchemaOptional so -> case H.lookup fieldName h of
473 SSchemaOptional so -> case H.lookup fieldName h of
474 Just v -> withSingI so $ FieldRepr <$> parseJSON v
474 Just v -> withSingI so $ FieldRepr <$> parseJSON v
475− Nothing -> fail "schemaoptional"
475+ Nothing -> withSingI so $ pure $ FieldRepr $ ReprOptional Nothing
476 SSchemaUnion ss -> withSingI ss $ FieldRepr <$> parseUnion ss value
476 SSchemaUnion ss -> withSingI ss $ FieldRepr <$> parseUnion ss value
477 (fieldRepr :&) <$> demoteFields tl h
477 (fieldRepr :&) <$> demoteFields tl h
478 ReprObject <$> withObject "Object" (demoteFields fs) value
478 ReprObject <$> withObject "Object" (demoteFields fs) value