Put state and event types at the top level
This commit is contained in:
parent
c60999edf0
commit
e7419b79fd
@ -51,13 +51,28 @@ join_errors(Prefix, Errors, Pfun) ->
|
|||||||
|
|
||||||
encode_contract(Contract) ->
|
encode_contract(Contract) ->
|
||||||
Cname = contract_name(Contract),
|
Cname = contract_name(Contract),
|
||||||
Tdefs = [ encode_typedef(T) ||
|
|
||||||
T <- sort_decls(contract_types(Contract)) ],
|
Tdefs0 = [ encode_typedef(T)
|
||||||
|
|| T <- sort_decls(contract_types(Contract)) ],
|
||||||
|
Tdefs = [ T || T = #{<<"name">> := N} <- Tdefs0,
|
||||||
|
N /= <<"state">>, N /= <<"event">> ],
|
||||||
|
StateT = case [ T || T = #{<<"name">> := N} <- Tdefs0, N == <<"state">> ] of
|
||||||
|
[#{<<"typedef">> := ST}] -> ST;
|
||||||
|
[] -> #{<<"tuple">> => []}
|
||||||
|
end,
|
||||||
|
EventT = case [ T || T = #{<<"name">> := N} <- Tdefs0, N == <<"event">> ] of
|
||||||
|
[#{<<"typedef">> := ET}] -> ET;
|
||||||
|
[] -> #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]}
|
||||||
|
end,
|
||||||
|
|
||||||
Fdefs = [ encode_function(F)
|
Fdefs = [ encode_function(F)
|
||||||
|| F <- sort_decls(contract_funcs(Contract)),
|
|| F <- sort_decls(contract_funcs(Contract)),
|
||||||
not is_private(F) ],
|
not is_private(F) ],
|
||||||
|
|
||||||
#{<<"contract">> => #{<<"name">> => encode_name(Cname),
|
#{<<"contract">> => #{<<"name">> => encode_name(Cname),
|
||||||
<<"type_defs">> => Tdefs,
|
<<"type_defs">> => Tdefs,
|
||||||
|
<<"state">> => StateT,
|
||||||
|
<<"event">> => EventT,
|
||||||
<<"functions">> => Fdefs}}.
|
<<"functions">> => Fdefs}}.
|
||||||
|
|
||||||
%% Encode a function definition. Currently we are only interested in
|
%% Encode a function definition. Currently we are only interested in
|
||||||
@ -177,9 +192,12 @@ decode(Json) ->
|
|||||||
|
|
||||||
decode_contract(#{<<"name">> := Name,
|
decode_contract(#{<<"name">> := Name,
|
||||||
<<"type_defs">> := Ts,
|
<<"type_defs">> := Ts,
|
||||||
|
<<"event">> := E,
|
||||||
|
<<"state">> := S,
|
||||||
<<"functions">> := Fs}) ->
|
<<"functions">> := Fs}) ->
|
||||||
|
MkTDef = fun(N, T) -> #{<<"name">> => N, <<"vars">> => [], <<"typedef">> => T} end,
|
||||||
["contract"," ",io_lib:format("~s", [Name])," =\n",
|
["contract"," ",io_lib:format("~s", [Name])," =\n",
|
||||||
decode_tdefs(Ts),
|
decode_tdefs([MkTDef(<<"state">>, S), MkTDef(<<"event">>, E) | Ts]),
|
||||||
decode_funcs(Fs)].
|
decode_funcs(Fs)].
|
||||||
|
|
||||||
decode_funcs(Fs) -> [ decode_func(F) || F <- Fs ].
|
decode_funcs(Fs) -> [ decode_func(F) || F <- Fs ].
|
||||||
@ -219,9 +237,12 @@ decode_type(#{<<"function">> := #{<<"arguments">> := Args, <<"returns">> := R}})
|
|||||||
[decode_type(#{<<"tuple">> => Args}), " => ", decode_type(R)];
|
[decode_type(#{<<"tuple">> => Args}), " => ", decode_type(R)];
|
||||||
decode_type(Econs) when is_map(Econs) -> %General constructor
|
decode_type(Econs) when is_map(Econs) -> %General constructor
|
||||||
[{Ec,Ets}] = maps:to_list(Econs),
|
[{Ec,Ets}] = maps:to_list(Econs),
|
||||||
C = decode_name(Ec),
|
AppName = decode_name(Ec),
|
||||||
Ts = decode_types(Ets),
|
AppArgs = decode_types(Ets),
|
||||||
[C,$(,lists:join(",", Ts),$)];
|
case AppArgs of
|
||||||
|
[] -> [AppName];
|
||||||
|
_ -> [AppName,$(,lists:join(", ", AppArgs),$)]
|
||||||
|
end;
|
||||||
decode_type(T) -> %Just raw names.
|
decode_type(T) -> %Just raw names.
|
||||||
decode_name(T).
|
decode_name(T).
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@ test_cases(1) ->
|
|||||||
MapACI = #{<<"contract">> =>
|
MapACI = #{<<"contract">> =>
|
||||||
#{<<"name">> => <<"C">>,
|
#{<<"name">> => <<"C">>,
|
||||||
<<"type_defs">> => [],
|
<<"type_defs">> => [],
|
||||||
|
<<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]},
|
||||||
|
<<"state">> => #{<<"tuple">> => []},
|
||||||
<<"functions">> =>
|
<<"functions">> =>
|
||||||
[#{<<"name">> => <<"a">>,
|
[#{<<"name">> => <<"a">>,
|
||||||
<<"arguments">> =>
|
<<"arguments">> =>
|
||||||
@ -27,6 +29,8 @@ test_cases(1) ->
|
|||||||
<<"returns">> => <<"int">>,
|
<<"returns">> => <<"int">>,
|
||||||
<<"stateful">> => false}]}},
|
<<"stateful">> => false}]}},
|
||||||
DecACI = <<"contract C =\n"
|
DecACI = <<"contract C =\n"
|
||||||
|
" type state = ()\n"
|
||||||
|
" datatype event = NoEventsDefined\n"
|
||||||
" function a : (int) => int\n">>,
|
" function a : (int) => int\n">>,
|
||||||
{Contract,MapACI,DecACI};
|
{Contract,MapACI,DecACI};
|
||||||
|
|
||||||
@ -40,6 +44,8 @@ test_cases(2) ->
|
|||||||
[#{<<"name">> => <<"allan">>,
|
[#{<<"name">> => <<"allan">>,
|
||||||
<<"typedef">> => <<"int">>,
|
<<"typedef">> => <<"int">>,
|
||||||
<<"vars">> => []}],
|
<<"vars">> => []}],
|
||||||
|
<<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]},
|
||||||
|
<<"state">> => #{<<"tuple">> => []},
|
||||||
<<"functions">> =>
|
<<"functions">> =>
|
||||||
[#{<<"arguments">> =>
|
[#{<<"arguments">> =>
|
||||||
[#{<<"name">> => <<"i">>,
|
[#{<<"name">> => <<"i">>,
|
||||||
@ -47,10 +53,16 @@ test_cases(2) ->
|
|||||||
<<"name">> => <<"a">>,
|
<<"name">> => <<"a">>,
|
||||||
<<"returns">> => <<"int">>,
|
<<"returns">> => <<"int">>,
|
||||||
<<"stateful">> => false}]}},
|
<<"stateful">> => false}]}},
|
||||||
DecACI = <<"contract C =\n type allan = int\n function a : (C.allan) => int\n">>,
|
DecACI = <<"contract C =\n"
|
||||||
|
" type state = ()\n"
|
||||||
|
" datatype event = NoEventsDefined\n"
|
||||||
|
" type allan = int\n"
|
||||||
|
" function a : (C.allan) => int\n">>,
|
||||||
{Contract,MapACI,DecACI};
|
{Contract,MapACI,DecACI};
|
||||||
test_cases(3) ->
|
test_cases(3) ->
|
||||||
Contract = <<"contract C =\n"
|
Contract = <<"contract C =\n"
|
||||||
|
" type state = ()\n"
|
||||||
|
" datatype event = NoEventsDefined\n"
|
||||||
" datatype bert('a) = Bin('a)\n"
|
" datatype bert('a) = Bin('a)\n"
|
||||||
" function a(i : bert(string)) = 1\n">>,
|
" function a(i : bert(string)) = 1\n">>,
|
||||||
MapACI = #{<<"contract">> =>
|
MapACI = #{<<"contract">> =>
|
||||||
@ -62,6 +74,8 @@ test_cases(3) ->
|
|||||||
<<"name">> => <<"a">>,<<"returns">> => <<"int">>,
|
<<"name">> => <<"a">>,<<"returns">> => <<"int">>,
|
||||||
<<"stateful">> => false}],
|
<<"stateful">> => false}],
|
||||||
<<"name">> => <<"C">>,
|
<<"name">> => <<"C">>,
|
||||||
|
<<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]},
|
||||||
|
<<"state">> => #{<<"tuple">> => []},
|
||||||
<<"type_defs">> =>
|
<<"type_defs">> =>
|
||||||
[#{<<"name">> => <<"bert">>,
|
[#{<<"name">> => <<"bert">>,
|
||||||
<<"typedef">> =>
|
<<"typedef">> =>
|
||||||
@ -69,6 +83,8 @@ test_cases(3) ->
|
|||||||
[#{<<"Bin">> => [<<"'a">>]}]},
|
[#{<<"Bin">> => [<<"'a">>]}]},
|
||||||
<<"vars">> => [#{<<"name">> => <<"'a">>}]}]}},
|
<<"vars">> => [#{<<"name">> => <<"'a">>}]}]}},
|
||||||
DecACI = <<"contract C =\n"
|
DecACI = <<"contract C =\n"
|
||||||
|
" type state = ()\n"
|
||||||
|
" datatype event = NoEventsDefined\n"
|
||||||
" datatype bert('a) = Bin('a)\n"
|
" datatype bert('a) = Bin('a)\n"
|
||||||
" function a : (C.bert(string)) => int\n">>,
|
" function a : (C.bert(string)) => int\n">>,
|
||||||
{Contract,MapACI,DecACI}.
|
{Contract,MapACI,DecACI}.
|
||||||
@ -85,10 +101,10 @@ aci_test_contract(Name) ->
|
|||||||
String = aeso_test_utils:read_contract(Name),
|
String = aeso_test_utils:read_contract(Name),
|
||||||
{ok, JSON} = aeso_aci:encode(String, [{include, {file_system, [aeso_test_utils:contract_path()]}}]),
|
{ok, JSON} = aeso_aci:encode(String, [{include, {file_system, [aeso_test_utils:contract_path()]}}]),
|
||||||
|
|
||||||
%% io:format("JSON:\n~s\n", [JSON]),
|
io:format("JSON:\n~s\n", [JSON]),
|
||||||
ContractStub = aeso_aci:decode(JSON),
|
ContractStub = aeso_aci:decode(JSON),
|
||||||
|
|
||||||
%% io:format("STUB:\n~s\n", [ContractStub]),
|
io:format("STUB:\n~s\n", [ContractStub]),
|
||||||
check_stub(ContractStub, [{src_file, Name}]),
|
check_stub(ContractStub, [{src_file, Name}]),
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user