ColdFrame.Callbacks.Scripting provides the generic
generic Callback_Type_Name : String; with function Value (S : String) return T is <>; package ColdFrame.Callbacks.Scripting
which creates a Tcl command callback-<callback_type_name> (lowercased) which takes one argument: the value to be provided.
The callback is made at execution time.
As an example,
with ColdFrame.Callbacks.Scripting;
with Digital_IO.Input_Signal_State_Callback;
package body Digital_IO.Scripting is
function Input_Signal_State_Value (S : String) return Input_Signal_State;
package Input_Signal_State_Callback
is new Digital_IO.Input_Signal_State_Callback.Scripting
(Callback_Type_Name => "digital_io.input_signal_state",
Value => Input_Signal_State_Value);
allows you to write
callback-digital_io.input_signal_state {0 true}
The function Input_Signal_State_Value is interesting because Input_Signal_State is a 2-component record,
type Input_Signal_State is record S : Input_Signal; State : Boolean; end record;
The Tcl list {0 true} above is presented by the instantiation of ColdFrame.Callbacks.Scripting as the string "0 true", which can be parsed as in
function Input_Signal_State_Value (S : String) return Input_Signal_State
is
Tokens : GNAT.String_Split.Slice_Set;
begin
GNAT.String_Split.Create (S => Tokens,
From => S,
Separators => " " & ASCII.HT,
Mode => GNAT.String_Split.Multiple);
if Natural (GNAT.String_Split.Slice_Count (Tokens)) /= 2 then
raise Constraint_Error
with "digital_io.input_signal_state requires 2 components";
end if;
return Result : Input_Signal_State do
Result.S :=
Input_Signal'Value (GNAT.String_Split.Slice
(Tokens,
GNAT.String_Split.Slice_Number (1)));
Result.State :=
Boolean'Value (GNAT.String_Split.Slice
(Tokens,
GNAT.String_Split.Slice_Number (2)));
end return;
end Input_Signal_State_Value;