0 | module Derive.Refined.JSON
2 | import public Derive.Refined
3 | import public JSON.Simple.Derive
4 | import Language.Reflection.Util
13 | refinedToJsonDef : (fun : Name) -> (p : ParamTypeInfo) -> RefinedInfo p -> Decl
14 | refinedToJsonDef fun (MkParamTypeInfo _ _ _ [c] _) (RI x) =
15 | def fun [patClause (var fun) `(toJSON .
~(var $
valName c.args x))]
24 | -> Res (List TopLevel)
25 | RefinedToJSONVis vis ns p = map decls $
refinedInfo p
28 | decls : RefinedInfo p -> List TopLevel
30 | let fun := funName p "toJson"
31 | impl := implName p "ToJSON"
32 | in [ TL (toJsonClaim vis fun p)
33 | (refinedToJsonDef fun p ri)
34 | , TL (toJsonImplClaim vis impl p) (toJsonImplDef fun impl)
38 | RefinedToJSON : List Name -> ParamTypeInfo -> Res (List TopLevel)
39 | RefinedToJSON = RefinedToJSONVis Export
46 | refineFromJSON : FromJSON a => String -> (a -> Maybe b) -> Parser JSON b
47 | refineFromJSON str f v = case fromJSON v of
48 | Right va => case f va of
50 | Nothing => fail "refining \{str} failed: \{show v}"
51 | Left s => prependContext str $
Left s
54 | refinedFromJsonDef : (fun,typeName, refineName : Name) -> Decl
55 | refinedFromJsonDef fun tn rn =
56 | def fun [patClause (var fun) `(refineFromJSON
~(tn.namePrim) ~(var rn))]
61 | RefinedFromJSONVis :
65 | -> Res (List TopLevel)
66 | RefinedFromJSONVis vis ns p = map decls $
refinedInfo p
69 | decls : RefinedInfo p -> List TopLevel
71 | let fun := funName p "fromJson"
72 | impl := implName p "FromJSON"
73 | refn := refineName p
74 | in [ TL (fromJsonClaim vis fun p)
75 | (refinedFromJsonDef fun p.getName refn)
76 | , TL (fromJsonImplClaim vis impl p) (fromJsonImplDef fun impl)
80 | RefinedFromJSON : List Name -> ParamTypeInfo -> Res (List TopLevel)
81 | RefinedFromJSON = RefinedFromJSONVis Export
90 | RefinedJSON : List Name -> ParamTypeInfo -> Res (List TopLevel)
91 | RefinedJSON ns p = sequenceJoin [RefinedToJSON ns p, RefinedFromJSON ns p]