From a216a97778fd135a701dbc9a811b3cb13b22f3fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Wed, 24 Jun 2020 20:13:46 +0200
Subject: [PATCH] [ivette] state names

---
 ivette/api/kernel/ast/index.ts        |  4 ++++
 ivette/api/kernel/properties/index.ts |  2 ++
 ivette/api/server_tsc.ml              |  8 ++++++--
 src/plugins/server/package.ml         |  7 ++++++-
 src/plugins/server/package.mli        |  7 ++++++-
 src/plugins/server/states.ml          | 22 +++++++++++++---------
 src/plugins/server/states.mli         |  1 +
 7 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/ivette/api/kernel/ast/index.ts b/ivette/api/kernel/ast/index.ts
index 18f6889d903..731f28b341c 100644
--- a/ivette/api/kernel/ast/index.ts
+++ b/ivette/api/kernel/ast/index.ts
@@ -71,6 +71,8 @@ export const markerKindTags: Server.GetRequest<null,tag[]> = {
 
 /** Markers data */
 export const markerData: State.Array<'#markerData',markerDataData> = {
+  name: 'kernel.ast.markerData',
+  key: 'key',
   signal: signalMarkerData,
   fetch: fetchMarkerData,
   reload: reloadMarkerData,
@@ -162,6 +164,8 @@ export const printFunction: Server.GetRequest<Json.Key<'#fct'>,text> = {
 
 /** AST Functions */
 export const functions: State.Array<'#functions',functionsData> = {
+  name: 'kernel.ast.functions',
+  key: 'key',
   signal: signalFunctions,
   fetch: fetchFunctions,
   reload: reloadFunctions,
diff --git a/ivette/api/kernel/properties/index.ts b/ivette/api/kernel/properties/index.ts
index a17f096b215..7dc2b45c16c 100644
--- a/ivette/api/kernel/properties/index.ts
+++ b/ivette/api/kernel/properties/index.ts
@@ -215,6 +215,8 @@ export const alarmsTags: Server.GetRequest<null,tag[]> = {
 
 /** Status of Registered Properties */
 export const status: State.Array<'#status',statusData> = {
+  name: 'kernel.properties.status',
+  key: 'key',
   signal: signalStatus,
   fetch: fetchStatus,
   reload: reloadStatus,
diff --git a/ivette/api/server_tsc.ml b/ivette/api/server_tsc.ml
index 4914eee0de3..6516ae96f8a 100644
--- a/ivette/api/server_tsc.ml
+++ b/ivette/api/server_tsc.ml
@@ -309,6 +309,7 @@ let makeDeclaration fmt names d =
     Format.fprintf fmt
       "@[<hov 2>export const %s: State.Value<@,%a@,> = {@]@\n"
       self.name jtype js ;
+    Format.fprintf fmt "  name: '%s',@\n" (Pkg.name_of_ident self) ;
     Format.fprintf fmt "  signal: %a,@\n"
       (jcall names) (Pkg.Derived.signal self) ;
     Format.fprintf fmt "  getter: %a,@\n"
@@ -319,6 +320,7 @@ let makeDeclaration fmt names d =
     Format.fprintf fmt
       "@[<hov 2>export const %s: State.State<@,%a@,> = {@]@\n"
       self.name jtype js ;
+    Format.fprintf fmt "  name: '%s',@\n" (Pkg.name_of_ident self) ;
     Format.fprintf fmt "  signal: %a,@\n"
       (jcall names) (Pkg.Derived.signal self) ;
     Format.fprintf fmt "  getter: %a,@\n"
@@ -327,11 +329,13 @@ let makeDeclaration fmt names d =
       (jcall names) (Pkg.Derived.setter self) ;
     Format.fprintf fmt "};@\n"
 
-  | D_array kd ->
+  | D_array { arr_key ; arr_kind } ->
     let data = Pkg.Derived.data self in
     Format.fprintf fmt
       "@[<hov 2>export const %s: State.Array<@,'#%s',@,%a@,> = {@]@\n"
-      self.name kd (jcall names) data ;
+      self.name arr_kind (jcall names) data ;
+    Format.fprintf fmt "  name: '%s',@\n" (Pkg.name_of_ident self) ;
+    Format.fprintf fmt "  key: '%s',@\n" arr_key ;
     Format.fprintf fmt "  signal: %a,@\n"
       (jcall names) (Pkg.Derived.signal self) ;
     Format.fprintf fmt "  fetch: %a,@\n"
diff --git a/src/plugins/server/package.ml b/src/plugins/server/package.ml
index b0361dcbd90..cde3cfeb3d3 100644
--- a/src/plugins/server/package.ml
+++ b/src/plugins/server/package.ml
@@ -205,6 +205,11 @@ type requestInfo = {
   rq_output: paramInfo ;
 }
 
+type arrayInfo = {
+  arr_key: string;
+  arr_kind: string;
+}
+
 type declKindInfo =
   | D_signal
   | D_type of jtype
@@ -213,7 +218,7 @@ type declKindInfo =
   | D_request of requestInfo
   | D_value of jtype
   | D_state of jtype
-  | D_array of string (* key kind *)
+  | D_array of arrayInfo (* key kind *)
   | D_safe of ident * jtype (* safe decoder *)
   | D_loose of ident * jtype (* loose decoder *)
   | D_order of ident * jtype (* natural ordering *)
diff --git a/src/plugins/server/package.mli b/src/plugins/server/package.mli
index 0e639a0ee9e..f60c02145bc 100644
--- a/src/plugins/server/package.mli
+++ b/src/plugins/server/package.mli
@@ -69,6 +69,11 @@ type requestInfo = {
   rq_output: paramInfo ;
 }
 
+type arrayInfo = {
+  arr_key: string;
+  arr_kind: string;
+}
+
 type declKindInfo =
   | D_signal
   | D_type of jtype
@@ -77,7 +82,7 @@ type declKindInfo =
   | D_request of requestInfo
   | D_value of jtype
   | D_state of jtype
-  | D_array of string
+  | D_array of arrayInfo
   | D_safe of ident * jtype (* safe decoder *)
   | D_loose of ident * jtype (* loose decoder *)
   | D_order of ident * jtype (* natural ordering *)
diff --git a/src/plugins/server/states.ml b/src/plugins/server/states.ml
index 9c49096ef34..c45af471fbe 100644
--- a/src/plugins/server/states.ml
+++ b/src/plugins/server/states.ml
@@ -126,6 +126,7 @@ type 'a content = {
 
 type 'a array = {
   signal : Request.signal ;
+  fkey : string ;
   key : 'a -> string ;
   iter : ('a -> unit) -> unit ;
   getter : (string * ('a -> json)) list ;
@@ -205,21 +206,22 @@ type buffer = {
   mutable updated : json list ;
 }
 
-let add_entry buffer cols key v =
+let add_entry buffer cols fkey key v =
   let fjs = List.fold_left (fun fjs (fd,to_json) ->
       try (fd , to_json v) :: fjs
       with Not_found -> fjs
     ) [] cols in
-  buffer.updated <- `Assoc( ("key", `String key):: fjs) :: buffer.updated ;
+  let row = (fkey, `String key) :: fjs in
+  buffer.updated <- `Assoc row :: buffer.updated ;
   buffer.capacity <- pred buffer.capacity
 
 let remove_entry buffer key =
   buffer.removed <- key :: buffer.removed ;
   buffer.capacity <- pred buffer.capacity
 
-let update_entry buffer cols key = function
+let update_entry buffer cols fkey key = function
   | Remove -> remove_entry buffer key
-  | Add v -> add_entry buffer cols key v
+  | Add v -> add_entry buffer cols fkey key v
 
 let fetch array n =
   let m = content array in
@@ -239,7 +241,7 @@ let fetch array n =
           begin fun v ->
             let key = array.key v in
             if buffer.capacity > 0 then
-              add_entry buffer array.getter key v
+              add_entry buffer array.getter array.fkey key v
             else
               ( m.updates <- Kmap.add key (Add v) m.updates ;
                 buffer.pending <- succ buffer.pending ) ;
@@ -249,7 +251,7 @@ let fetch array n =
       m.updates <- Kmap.filter
           begin fun key upd ->
             if buffer.capacity > 0 then
-              ( update_entry buffer array.getter key upd ; false )
+              ( update_entry buffer array.getter array.fkey key upd ; false )
             else
               ( buffer.pending <- succ buffer.pending ; true )
           end m.updates ;
@@ -260,7 +262,9 @@ let fetch array n =
 (* --- Signature Registry                                                 --- *)
 (* -------------------------------------------------------------------------- *)
 
-let register_array ~package ~name ~descr ~key ?(keyKind=name)
+let register_array ~package ~name ~descr ~key
+    ?(keyName="key")
+    ?(keyKind=name)
     ~(iter : 'a callback)
     ?(add_update_hook : 'a callback option)
     ?(add_remove_hook : 'a callback option)
@@ -275,7 +279,7 @@ let register_array ~package ~name ~descr ~key ?(keyKind=name)
       fd_descr = plain "Entry identifier." ;
     } :: List.map fst columns in
   let id = Package.declare_id ~package:package ~name:name ~descr
-      (D_array keyKind) in
+      (D_array { arr_key = keyName ; arr_kind = keyKind }) in
   let signal = Request.signal
       ~package ~name:(Package.Derived.signal id).name
       ~descr:(plain "Signal for array" @ href) in
@@ -286,7 +290,7 @@ let register_array ~package ~name ~descr ~key ?(keyKind=name)
   let getter =
     List.map Package.(fun (fd,to_js) -> fd.fd_name , to_js) !model in
   let array = {
-    key ; iter ; getter ; signal ;
+    fkey = keyName ; key ; iter ; getter ; signal ;
     current = None ; projects = Hashtbl.create 0
   } in
   let signature = Request.signature ~input:(module Jint) () in
diff --git a/src/plugins/server/states.mli b/src/plugins/server/states.mli
index fe842f61346..3e2c681cb40 100644
--- a/src/plugins/server/states.mli
+++ b/src/plugins/server/states.mli
@@ -124,6 +124,7 @@ val register_array :
   name:string ->
   descr:Markdown.text ->
   key:('a -> string) ->
+  ?keyName:string ->
   ?keyKind:string ->
   iter:('a callback) ->
   ?add_update_hook:('a callback) ->
-- 
GitLab