From 8d394a0c32936f9be3d27ebade591daf490e1990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Thu, 9 Jul 2020 09:44:58 +0200 Subject: [PATCH] [server] added Jtag for light enums --- ivette/api/server_tsc.ml | 6 ++++-- ivette/src/dome/src/renderer/data/json.ts | 9 +++++++++ src/plugins/server/package.ml | 16 +++++++++------- src/plugins/server/package.mli | 4 +++- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ivette/api/server_tsc.ml b/ivette/api/server_tsc.ml index 8f5eb6e829b..2fbbeae1873 100644 --- a/ivette/api/server_tsc.ml +++ b/ivette/api/server_tsc.ml @@ -74,6 +74,7 @@ let makeJtype ?self ~names = | Jnumber -> Format.pp_print_string fmt "number" | Jboolean -> Format.pp_print_string fmt "boolean" | Jstring | Jalpha -> Format.pp_print_string fmt "string" + | Jtag a -> Format.fprintf fmt "\"%s\"" a | Jkey kd -> Format.fprintf fmt "Json.key<'#%s'>" kd | Jindex kd -> Format.fprintf fmt "Json.index<'#%s'>" kd | Jdict(kd,js) -> Format.fprintf fmt "Json.Dict<'#%s',%a>" kd pp js @@ -166,6 +167,7 @@ let rec makeDecoder ~safe ?self ~names fmt js = | Jboolean -> jsafe ~safe "Boolean" jprim fmt "jBoolean" | Jnumber -> jsafe ~safe "Number" jprim fmt "jNumber" | Jstring | Jalpha -> jsafe ~safe "String" jprim fmt "jString" + | Jtag a -> Format.fprintf fmt "jTag(\"%s\")" a | Jkey kd -> jsafe ~safe ("#" ^ kd) jkey fmt kd | Jindex kd -> jsafe ~safe ("#" ^ kd) jindex fmt kd | Jdata id -> jcall names fmt (Pkg.Derived.decode ~safe id) @@ -223,8 +225,6 @@ let makeOrder ~self ~names fmt js = | Jdata id -> jcall names fmt (Pkg.Derived.order id) | Joption js -> Format.fprintf fmt "@[<hov 2>Compare.defined(@,%a)@]" pp js - | Jany | Junion _ -> (* Can not find a better solution *) - Format.fprintf fmt "Compare.structural" | Jenum id -> Format.fprintf fmt "@[<hov 2>Compare.byEnum(@,%a)@]" (jcall names) id | Jlist js | Jarray js -> @@ -250,6 +250,8 @@ let makeOrder ~self ~names fmt js = Format.fprintf fmt "@[<hov 2>Compare.dictionary<@,Json.dict<'#%s'@,%a>>(@,%a)@]" kd jtype js pp js + | Jany | Junion _ | Jtag _ -> + Format.fprintf fmt "Compare.structural" in pp fmt js (* -------------------------------------------------------------------------- *) diff --git a/ivette/src/dome/src/renderer/data/json.ts b/ivette/src/dome/src/renderer/data/json.ts index ba0be2fc66f..e79d5515597 100644 --- a/ivette/src/dome/src/renderer/data/json.ts +++ b/ivette/src/dome/src/renderer/data/json.ts @@ -118,6 +118,15 @@ export const jString: Loose<string> = (js: json) => ( typeof js === 'string' ? js : undefined ); +/** JSON constant. + Capture the tag or returns `undefined`. + Can be used with [[jUnion]], although [[jEnum]] + might be more efficient. +*/ +export function jTag<A>(tg: A): Loose<A> { + return (js: json) => Object.is(js, tg) ? tg : undefined; +} + /** Lookup tags in a dictionary. Can be used directly for enum types, eg. `jEnum(myEnumType)`. diff --git a/src/plugins/server/package.ml b/src/plugins/server/package.ml index 6f2e56f956b..cb716919cf5 100644 --- a/src/plugins/server/package.ml +++ b/src/plugins/server/package.ml @@ -166,6 +166,7 @@ type jtype = | Jnumber | Jstring | Jalpha (* string primarily compared without case *) + | Jtag of string (* single constant string *) | Jkey of string (* kind of a string used for indexing *) | Jindex of string (* kind of an integer used for indexing *) | Joption of jtype @@ -289,14 +290,14 @@ let rec isRecursive = function | Jself -> true | Jdata _ | Jenum _ | Jany | Jnull | Jboolean | Jnumber - | Jstring | Jalpha | Jkey _ | Jindex _ -> false + | Jstring | Jalpha | Jkey _ | Jindex _ | Jtag _ -> false | Joption js | Jdict(_,js) | Jarray js | Jlist js -> isRecursive js | Jtuple js | Junion js -> List.exists isRecursive js | Jrecord fjs -> List.exists (fun (_,js) -> isRecursive js) fjs let rec visit_jtype fn = function | Jany | Jself | Jnull | Jboolean | Jnumber - | Jstring | Jalpha | Jkey _ | Jindex _ -> () + | Jstring | Jalpha | Jkey _ | Jindex _ | Jtag _ -> () | Joption js | Jdict(_,js) | Jarray js | Jlist js -> visit_jtype fn js | Jtuple js | Junion js -> List.iter (visit_jtype fn) js | Jrecord fjs -> List.iter (fun (_,js) -> visit_jtype fn js) fjs @@ -447,7 +448,7 @@ let iter f = let key kd = Md.plain (Printf.sprintf "`#%s`" kd) let index kd = Md.plain (Printf.sprintf "`#0%s`" kd) -let escaped tag = Md.plain (Printf.sprintf "`\"%s\"`" @@ String.escaped tag) +let litteral tag = Md.plain (Printf.sprintf "`\"%s\"`" tag) type pp = { self: Md.text ; @@ -461,6 +462,7 @@ let rec md_jtype pp = function | Jnumber -> Md.emph "number" | Jboolean -> Md.emph "boolean" | Jstring | Jalpha -> Md.emph "string" + | Jtag a -> litteral a | Jkey kd -> key kd | Jindex kd -> index kd | Jdata id | Jenum id -> pp.ident id @@ -478,7 +480,7 @@ and md_jlist pp sep js = and fields pp fjs = Md.glue ~sep:(Md.plain ",") @@ List.map (fun (fd,js) -> - escaped fd @ + litteral fd @ match js with | Joption js -> Md.code ":?" @ md_jtype pp js | _ -> Md.code ":" @ md_jtype pp js @@ -501,7 +503,7 @@ let md_tags ?(title="Tags") (tags : tagInfo list) = ] in let row tg = [ tg.tg_label ; - escaped tg.tg_name ; + litteral tg.tg_name ; tg.tg_descr ; ] in Md.{ caption = None ; header ; content = List.map row tags } @@ -515,12 +517,12 @@ let md_fields ?(title="Field") pp (fields : fieldInfo list) = let row f = match f.fd_type with | Joption js -> [ - escaped (f.fd_name ^ "?") ; + litteral f.fd_name @ Md.plain "(opt.)" ; md_jtype pp js ; f.fd_descr ; ] | _ -> [ - escaped f.fd_name ; + litteral f.fd_name ; md_jtype pp f.fd_type ; f.fd_descr ; ] diff --git a/src/plugins/server/package.mli b/src/plugins/server/package.mli index c040c985bc8..85af7f86923 100644 --- a/src/plugins/server/package.mli +++ b/src/plugins/server/package.mli @@ -34,6 +34,7 @@ type jtype = | Jnumber | Jstring | Jalpha (** string primarily compared without case *) + | Jtag of string (** single constant string *) | Jkey of string (** kind of a string used for indexing *) | Jindex of string (** kind of an integer used for indexing *) | Joption of jtype @@ -222,7 +223,8 @@ type pp = { ident: ident -> Markdown.text ; } -val escaped : string -> Markdown.text +(** Quoted string *) +val litteral : string -> Markdown.text val md_jtype : pp -> jtype -> Markdown.text val md_tags : ?title:string -> tagInfo list -> Markdown.table -- GitLab