Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 48bcccdf23 | |||
| 03b9756066 | |||
| d65a048409 | |||
| 9280495b18 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -8,9 +8,7 @@ cancer
|
|||||||
erl_crash.dump
|
erl_crash.dump
|
||||||
ebin/*.beam
|
ebin/*.beam
|
||||||
doc/*.html
|
doc/*.html
|
||||||
doc/*.css
|
|
||||||
doc/edoc-info
|
doc/edoc-info
|
||||||
doc/erlang.png
|
|
||||||
rel/example_project
|
rel/example_project
|
||||||
.concrete/DEV_MODE
|
.concrete/DEV_MODE
|
||||||
.rebar
|
.rebar
|
||||||
|
|||||||
BIN
doc/erlang.png
Normal file
BIN
doc/erlang.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
75
doc/stylesheet.css
Normal file
75
doc/stylesheet.css
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/* standard EDoc style sheet */
|
||||||
|
body {
|
||||||
|
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||||
|
margin-left: .25in;
|
||||||
|
margin-right: .2in;
|
||||||
|
margin-top: 0.2in;
|
||||||
|
margin-bottom: 0.2in;
|
||||||
|
color: #696969;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
a:link{
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
a:visited{
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
a:hover{
|
||||||
|
color: #d8613c;
|
||||||
|
}
|
||||||
|
h1,h2 {
|
||||||
|
margin-left: -0.2in;
|
||||||
|
}
|
||||||
|
div.navbar {
|
||||||
|
background-color: #000000;
|
||||||
|
padding: 0.2em;
|
||||||
|
}
|
||||||
|
h2.indextitle {
|
||||||
|
padding: 0.4em;
|
||||||
|
color: #dfdfdf;
|
||||||
|
background-color: #000000;
|
||||||
|
}
|
||||||
|
div.navbar a:link {
|
||||||
|
color: #dfdfdf;
|
||||||
|
}
|
||||||
|
div.navbar a:visited {
|
||||||
|
color: #dfdfdf;
|
||||||
|
}
|
||||||
|
div.navbar a:hover {
|
||||||
|
color: #d8613c;
|
||||||
|
}
|
||||||
|
h3.function,h3.typedecl {
|
||||||
|
background-color: #000000;
|
||||||
|
color: #dfdfdf;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
div.spec {
|
||||||
|
margin-left: 2em;
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
a.module {
|
||||||
|
text-decoration:none
|
||||||
|
}
|
||||||
|
a.module:hover {
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
ul.definitions {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
ul.index {
|
||||||
|
list-style-type: none;
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Minor style tweaks
|
||||||
|
*/
|
||||||
|
ul {
|
||||||
|
list-style-type: square;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
padding: 3
|
||||||
|
}
|
||||||
@ -3,7 +3,7 @@
|
|||||||
{included_applications,[]},
|
{included_applications,[]},
|
||||||
{applications,[stdlib,kernel]},
|
{applications,[stdlib,kernel]},
|
||||||
{description,"Gajumaru interoperation library"},
|
{description,"Gajumaru interoperation library"},
|
||||||
{vsn,"0.8.2"},
|
{vsn,"0.8.3"},
|
||||||
{modules,[hakuzaru,hz,hz_fetcher,hz_format,hz_grids,
|
{modules,[hakuzaru,hz,hz_fetcher,hz_format,hz_grids,
|
||||||
hz_key_master,hz_man,hz_sup]},
|
hz_key_master,hz_man,hz_sup]},
|
||||||
{mod,{hakuzaru,[]}}]}.
|
{mod,{hakuzaru,[]}}]}.
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hakuzaru).
|
-module(hakuzaru).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-author("Craig Everett <ceverett@tsuriai.jp>").
|
-author("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-license("GPL-3.0-or-later").
|
-license("GPL-3.0-or-later").
|
||||||
|
|||||||
1094
src/hz.erl
1094
src/hz.erl
File diff suppressed because it is too large
Load Diff
1186
src/hz_aaci.erl
1186
src/hz_aaci.erl
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
-module(hz_fetcher).
|
-module(hz_fetcher).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-author("Craig Everett <ceverett@tsuriai.jp>").
|
-author("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-license("MIT").
|
-license("MIT").
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hz_format).
|
-module(hz_format).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-author("Craig Everett <ceverett@tsuriai.jp>").
|
-author("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-license("GPL-3.0-or-later").
|
-license("GPL-3.0-or-later").
|
||||||
|
|||||||
@ -37,8 +37,8 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hz_grids).
|
-module(hz_grids).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-export([url/2, url/3, url/4, parse/1, req/2, req/3]).
|
-export([url/2, url/3, url/4, parse/1, req/2, req/3, req/4]).
|
||||||
|
|
||||||
|
|
||||||
-spec url(Instruction, HTTP) -> Result
|
-spec url(Instruction, HTTP) -> Result
|
||||||
@ -193,24 +193,28 @@ l_to_i(S) ->
|
|||||||
req(Type, Message) ->
|
req(Type, Message) ->
|
||||||
req(Type, Message, false).
|
req(Type, Message, false).
|
||||||
|
|
||||||
req(sign, Message, ID) ->
|
req(Type, Message, ID) ->
|
||||||
|
{ok, NetworkID} = hz:network_id(),
|
||||||
|
req(Type, Message, ID, NetworkID).
|
||||||
|
|
||||||
|
req(sign, Message, ID, NetworkID) ->
|
||||||
#{"grids" => 1,
|
#{"grids" => 1,
|
||||||
"chain" => "gajumaru",
|
"chain" => "gajumaru",
|
||||||
"network_id" => hz:network_id(),
|
"network_id" => NetworkID,
|
||||||
"type" => "message",
|
"type" => "message",
|
||||||
"public_id" => ID,
|
"public_id" => ID,
|
||||||
"payload" => Message};
|
"payload" => Message};
|
||||||
req(tx, Data, ID) ->
|
req(tx, Data, ID, NetworkID) ->
|
||||||
#{"grids" => 1,
|
#{"grids" => 1,
|
||||||
"chain" => "gajumaru",
|
"chain" => "gajumaru",
|
||||||
"network_id" => hz:network_id(),
|
"network_id" => NetworkID,
|
||||||
"type" => "tx",
|
"type" => "tx",
|
||||||
"public_id" => ID,
|
"public_id" => ID,
|
||||||
"payload" => Data};
|
"payload" => Data};
|
||||||
req(ack, Message, ID) ->
|
req(ack, Message, ID, NetworkID) ->
|
||||||
#{"grids" => 1,
|
#{"grids" => 1,
|
||||||
"chain" => "gajumaru",
|
"chain" => "gajumaru",
|
||||||
"network_id" => hz:network_id(),
|
"network_id" => NetworkID,
|
||||||
"type" => "ack",
|
"type" => "ack",
|
||||||
"public_id" => ID,
|
"public_id" => ID,
|
||||||
"payload" => Message}.
|
"payload" => Message}.
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hz_key_master).
|
-module(hz_key_master).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
|
|
||||||
|
|
||||||
-export([make_key/1, encode/1, decode/1]).
|
-export([make_key/1, encode/1, decode/1]).
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hz_man).
|
-module(hz_man).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-behavior(gen_server).
|
-behavior(gen_server).
|
||||||
-author("Craig Everett <ceverett@tsuriai.jp>").
|
-author("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
-copyright("Craig Everett <ceverett@tsuriai.jp>").
|
||||||
|
|||||||
@ -1,267 +0,0 @@
|
|||||||
-module(hz_sophia).
|
|
||||||
-vsn("0.8.2").
|
|
||||||
-author("Jarvis Carroll <spiveehere@gmail.com>").
|
|
||||||
-copyright("Jarvis Carroll <spiveehere@gmail.com>").
|
|
||||||
-license("GPL-3.0-or-later").
|
|
||||||
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
|
||||||
|
|
||||||
parse_literal(Type, String) ->
|
|
||||||
case parse_expression(Type, {tk, 1, 1}, String) of
|
|
||||||
{ok, {Result, NewTk, NewString}} ->
|
|
||||||
parse_literal2(Result, NewTk, NewString);
|
|
||||||
{error, Reason} ->
|
|
||||||
{error, Reason}
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_literal2(Result, Tk, String) ->
|
|
||||||
% We have parsed a valid expression. Now check that the string ends.
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{eof, _, _, _, _}, _, _}} ->
|
|
||||||
{ok, Result};
|
|
||||||
{ok, {{_, S, Row, Start, End}, _, _}} ->
|
|
||||||
{error, {unexpected_token, S, Row, Start, End}};
|
|
||||||
{error, Reason} ->
|
|
||||||
{error, Reason}
|
|
||||||
end.
|
|
||||||
|
|
||||||
%%% Tokenizer
|
|
||||||
|
|
||||||
next_token({tk, Row, Col}, []) ->
|
|
||||||
{ok, {{eof, "", Row, Col, Col}, {tk, Row, Col}, []}};
|
|
||||||
next_token({tk, Row, Col}, " " ++ Rest) ->
|
|
||||||
next_token({tk, Row + 1, Col}, Rest);
|
|
||||||
next_token({tk, Row, Col}, "\t" ++ Rest) ->
|
|
||||||
next_token({tk, Row + 1, Col}, Rest);
|
|
||||||
next_token(Tk, [N | _] = String) when N >= $0, N =< $9 ->
|
|
||||||
num_token(Tk, Tk, String, []);
|
|
||||||
next_token(Tk, [N | _] = String) when N >= $A, N =< $Z ->
|
|
||||||
alphanum_token(Tk, Tk, String, []);
|
|
||||||
next_token(Tk, [N | _] = String) when N >= $a, N =< $z ->
|
|
||||||
alphanum_token(Tk, Tk, String, []);
|
|
||||||
next_token(Tk, [$_ | _] = String) ->
|
|
||||||
alphanum_token(Tk, Tk, String, []);
|
|
||||||
next_token({tk, Row, Col}, [Char | Rest]) ->
|
|
||||||
Token = {character, [Char], Row, Col, Col},
|
|
||||||
{ok, {Token, {tk, Row + 1, Col}, Rest}}.
|
|
||||||
|
|
||||||
num_token(Start, {tk, Row, Col}, [N | Rest], Acc) when N >= $0, N =< $9 ->
|
|
||||||
num_token(Start, {tk, Row + 1, Col}, Rest, [N | Acc]);
|
|
||||||
num_token({tk, _, Start}, {tk, Row, End}, String, Acc) ->
|
|
||||||
NumString = lists:reverse(Acc),
|
|
||||||
Token = {integer, NumString, Row, Start, End},
|
|
||||||
{ok, {Token, {tk, Row, End}, String}}.
|
|
||||||
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, [C | Rest], Acc) when C >= $A, C =< $Z ->
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, Rest, [C | Acc]);
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, [C | Rest], Acc) when C >= $a, C =< $z ->
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, Rest, [C | Acc]);
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, [C | Rest], Acc) when C >= $0, C =< $9 ->
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, Rest, [C | Acc]);
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, [$_ | Rest], Acc) ->
|
|
||||||
alphanum_token(Start, {tk, Row, Col}, Rest, [$_ | Acc]);
|
|
||||||
alphanum_token({tk, _, Start}, {tk, Row, End}, String, Acc) ->
|
|
||||||
AlphaString = lists:reverse(Acc),
|
|
||||||
Token = {alphanum, AlphaString, Row, Start, End},
|
|
||||||
{ok, {Token, {tk, Row, End}, String}}.
|
|
||||||
|
|
||||||
|
|
||||||
%%% Sophia Literal Parser
|
|
||||||
|
|
||||||
%%% This parser is a simple recursive descent parser, written explicitly in
|
|
||||||
%%% erlang.
|
|
||||||
%%%
|
|
||||||
%%% There are no infix operators in the subset we want to parse, so recursive
|
|
||||||
%%% descent is fine with no special tricks, no shunting yard algorithm, no
|
|
||||||
%%% parser generators, etc.
|
|
||||||
%%%
|
|
||||||
%%% If we were writing this in C then we might want to work iteratively with an
|
|
||||||
%%% array of finite state machines, i.e. with a pushdown automaton, instead of
|
|
||||||
%%% using recursion. This is a tried and true method of making fast parsers.
|
|
||||||
%%% Recall, however, that the BEAM *is* a stack machine, written in C, so
|
|
||||||
%%% rather than writing confusing iterative code in Erlang, to simulate a
|
|
||||||
%%% pushdown automaton inside another simulated stack machine... we should just
|
|
||||||
%%% write the recursive code, thus programming the BEAM to implement the
|
|
||||||
%%% pushdown automaton that we want.
|
|
||||||
|
|
||||||
parse_expression(Type, Tk, String) ->
|
|
||||||
{ok, {Token, NewTk, NewString}} = next_token(Tk, String),
|
|
||||||
parse_expression2(Type, NewTk, NewString, Token).
|
|
||||||
|
|
||||||
parse_expression2(Type, Tk, String, {integer, S, Row, Start, End}) ->
|
|
||||||
Value = list_to_integer(S),
|
|
||||||
case Type of
|
|
||||||
{_, _, integer} ->
|
|
||||||
{ok, {Value, Tk, String}};
|
|
||||||
{_, _, unknown_type} ->
|
|
||||||
{ok, {Value, Tk, String}};
|
|
||||||
{O, N, _} ->
|
|
||||||
{error, {wrong_type, O, N, integer, Row, Start, End}}
|
|
||||||
end;
|
|
||||||
parse_expression2(Type, Tk, String, {character, "[", Row, Start, _}) ->
|
|
||||||
parse_list(Type, Tk, String, Row, Start);
|
|
||||||
parse_expression2(Type, Tk, String, {character, "{", Row, Start, _}) ->
|
|
||||||
parse_record_or_map(Type, Tk, String, Row, Start);
|
|
||||||
parse_expression2(_, _, _, {_, S, Row, Start, End}) ->
|
|
||||||
{error, {unexpected_token, S, Row, Start, End}}.
|
|
||||||
|
|
||||||
unknown_type() ->
|
|
||||||
{unknown_type, already_normalized, unknown_type}.
|
|
||||||
|
|
||||||
expect_tokens([], Tk, String) ->
|
|
||||||
{ok, {Tk, String}};
|
|
||||||
expect_tokens([Str | Rest], Tk, String) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{_, Str, _, _, _}, NewTk, NewString}} ->
|
|
||||||
expect_tokens(Rest, NewTk, NewString);
|
|
||||||
{ok, {{_, Actual, Row, Start, End}}} ->
|
|
||||||
{error, {unexpected_token, Actual, Row, Start, End}}
|
|
||||||
end.
|
|
||||||
|
|
||||||
%%% List Parsing
|
|
||||||
|
|
||||||
parse_list({_, _, {list, [Inner]}}, Tk, String, Row, Start) ->
|
|
||||||
parse_list_loop(Inner, Tk, String, Row, Start, []);
|
|
||||||
parse_list({_, _, unknown_type}, Tk, String, Row, Start) ->
|
|
||||||
parse_list_loop(unknown_type(), Tk, String, Row, Start, []);
|
|
||||||
parse_list({O, N, _}, _, _, Row, Start) ->
|
|
||||||
{error, {wrong_type, O, N, list, Row, Start, Start}}.
|
|
||||||
|
|
||||||
parse_list_loop(Inner, Tk, String, Row, Start, Acc) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{character, "]", _, _, _}, NewTk, NewString}} ->
|
|
||||||
{ok, {lists:reverse(Acc), NewTk, NewString}};
|
|
||||||
{ok, {Token, NewTk, NewString}} ->
|
|
||||||
parse_list_loop2(Inner, NewTk, NewString, Row, Start, Acc, Token)
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_list_loop2(Inner, Tk, String, Row, Start, Acc, Token) ->
|
|
||||||
case parse_expression2(Inner, Tk, String, Token) of
|
|
||||||
{ok, {Value, NewTk, NewString}} ->
|
|
||||||
parse_list_loop3(Inner, NewTk, NewString, Row, Start, [Value | Acc]);
|
|
||||||
{error, Reason} ->
|
|
||||||
Wrapped = wrap_error(Reason, {list_element, length(Acc)}),
|
|
||||||
{error, Wrapped}
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_list_loop3(Inner, Tk, String, Row, Start, Acc) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{character, "]", _, _, _}, NewTk, NewString}} ->
|
|
||||||
{ok, {lists:reverse(Acc), NewTk, NewString}};
|
|
||||||
{ok, {{character, ",", _, _, _}, NewTk, NewString}} ->
|
|
||||||
parse_list_loop(Inner, NewTk, NewString, Row, Start, Acc);
|
|
||||||
{error, Reason} ->
|
|
||||||
{error, Reason}
|
|
||||||
end.
|
|
||||||
|
|
||||||
%%% Record parsing
|
|
||||||
|
|
||||||
parse_record_or_map({_, _, {map, [KeyType, ValueType]}}, Tk, String, _, _) ->
|
|
||||||
parse_map(KeyType, ValueType, Tk, String, #{});
|
|
||||||
parse_record_or_map({_, _, {record, Fields}}, Tk, String, _, _) ->
|
|
||||||
parse_record(Fields, Tk, String);
|
|
||||||
parse_record_or_map({_, _, unknown_type}, Tk, String, _, _) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{character, "}", _, _, _}, NewTk, NewString}} ->
|
|
||||||
{ok, {#{}, NewTk, NewString}};
|
|
||||||
{ok, {{character, "[", _, _, _}, NewTk, NewString}} ->
|
|
||||||
parse_map2(unknown_type(), unknown_type(), NewTk, NewString, #{});
|
|
||||||
{ok, {{alphanum, _, Row, Start, End}, _, _}} ->
|
|
||||||
{error, {unresolved_record, Row, Start, End}};
|
|
||||||
{ok, {{_, S, Row, Start, End}, _, _}} ->
|
|
||||||
{error, {unexpected_token, S, Row, Start, End}}
|
|
||||||
end;
|
|
||||||
parse_record_or_map({O, N, _}, _, _, Row, Start) ->
|
|
||||||
{error, {wrong_type, O, N, map, Row, Start, Start}}.
|
|
||||||
|
|
||||||
parse_record(Fields, Tk, String) ->
|
|
||||||
{error, not_yet_implemented}.
|
|
||||||
|
|
||||||
%%% Map Parsing
|
|
||||||
|
|
||||||
parse_map(KeyType, ValueType, Tk, String, Acc) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{character, "[", _, _, _}, NewTk, NewString}} ->
|
|
||||||
parse_map2(KeyType, ValueType, NewTk, NewString, Acc);
|
|
||||||
{ok, {{character, "}", _, _, _}, NewTk, NewString}} ->
|
|
||||||
{ok, {Acc, NewTk, NewString}};
|
|
||||||
{ok, {{_, S, Row, Start, End}}} ->
|
|
||||||
{error, {unexpected_token, S, Row, Start, End}}
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_map2(KeyType, ValueType, Tk, String, Acc) ->
|
|
||||||
case parse_expression(KeyType, Tk, String) of
|
|
||||||
{ok, {Result, NewTk, NewString}} ->
|
|
||||||
parse_map3(KeyType, ValueType, NewTk, NewString, Acc, Result);
|
|
||||||
{error, Reason} ->
|
|
||||||
wrap_error(Reason, {map_key, maps:size(Acc)})
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_map3(KeyType, ValueType, Tk, String, Acc, Key) ->
|
|
||||||
case expect_tokens(["]", "="], Tk, String) of
|
|
||||||
{ok, {NewTk, NewString}} ->
|
|
||||||
parse_map4(KeyType, ValueType, NewTk, NewString, Acc, Key);
|
|
||||||
{error, Reason} ->
|
|
||||||
{error, Reason}
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_map4(KeyType, ValueType, Tk, String, Acc, Key) ->
|
|
||||||
case parse_expression(ValueType, Tk, String) of
|
|
||||||
{ok, {Result, NewTk, NewString}} ->
|
|
||||||
NewAcc = maps:put(Key, Result, Acc),
|
|
||||||
parse_map5(KeyType, ValueType, NewTk, NewString, NewAcc);
|
|
||||||
{error, Reason} ->
|
|
||||||
{error, Reason}
|
|
||||||
end.
|
|
||||||
|
|
||||||
parse_map5(KeyType, ValueType, Tk, String, Acc) ->
|
|
||||||
case next_token(Tk, String) of
|
|
||||||
{ok, {{character, ",", _, _, _}, NewTk, NewString}} ->
|
|
||||||
parse_map(KeyType, ValueType, NewTk, NewString, Acc);
|
|
||||||
{ok, {{character, "}", _, _, _}, NewTk, NewString}} ->
|
|
||||||
{ok, {Acc, NewTk, NewString}};
|
|
||||||
{ok, {{_, S, Row, Start, End}}} ->
|
|
||||||
{error, {unexpected_token, S, Row, Start, End}}
|
|
||||||
end.
|
|
||||||
|
|
||||||
% TODO
|
|
||||||
wrap_error(Reason, _) -> Reason.
|
|
||||||
|
|
||||||
%%% Tests
|
|
||||||
|
|
||||||
check_sophia_to_fate(Type, Sophia, Fate) ->
|
|
||||||
{ok, FateActual} = parse_literal(Type, Sophia),
|
|
||||||
case FateActual of
|
|
||||||
Fate ->
|
|
||||||
ok;
|
|
||||||
_ ->
|
|
||||||
erlang:error({to_fate_failed, Fate, FateActual})
|
|
||||||
end.
|
|
||||||
|
|
||||||
check_parser(Type, Sophia, Fate) ->
|
|
||||||
check_sophia_to_fate(Type, Sophia, Fate),
|
|
||||||
check_sophia_to_fate(unknown_type(), Sophia, Fate),
|
|
||||||
|
|
||||||
% Finally, check that the FATE result is something that gmb understands.
|
|
||||||
gmb_fate_encoding:serialize(Fate),
|
|
||||||
|
|
||||||
ok.
|
|
||||||
|
|
||||||
check_parser(Sophia, Fate) ->
|
|
||||||
Source = "contract C = entrypoint f() = " ++ Sophia,
|
|
||||||
{ok, AACI} = hz_aaci:aaci_from_string(Source),
|
|
||||||
{ok, {_, Type}} = hz_aaci:get_function_signature(AACI, "f"),
|
|
||||||
check_parser(Type, Sophia, Fate).
|
|
||||||
|
|
||||||
int_test() ->
|
|
||||||
check_parser("123", 123).
|
|
||||||
|
|
||||||
list_test() ->
|
|
||||||
check_parser("[1, 2, 3]", [1, 2, 3]).
|
|
||||||
|
|
||||||
list_of_lists_test() ->
|
|
||||||
check_parser("[[], [1], [2, 3]]", [[], [1], [2, 3]]).
|
|
||||||
|
|
||||||
maps_test() ->
|
|
||||||
check_parser("{[1] = 2, [3] = 4}", #{1 => 2, 3 => 4}).
|
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
%%% @end
|
%%% @end
|
||||||
|
|
||||||
-module(hz_sup).
|
-module(hz_sup).
|
||||||
-vsn("0.8.2").
|
-vsn("0.8.3").
|
||||||
-behaviour(supervisor).
|
-behaviour(supervisor).
|
||||||
-author("Craig Everett <zxq9@zxq9.com>").
|
-author("Craig Everett <zxq9@zxq9.com>").
|
||||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
{prefix,"hz"}.
|
{prefix,"hz"}.
|
||||||
{desc,"Gajumaru interoperation library"}.
|
{desc,"Gajumaru interoperation library"}.
|
||||||
{author,"Craig Everett"}.
|
{author,"Craig Everett"}.
|
||||||
{package_id,{"otpr","hakuzaru",{0,8,2}}}.
|
{package_id,{"otpr","hakuzaru",{0,8,3}}}.
|
||||||
{deps,[{"otpr","sophia",{9,0,0}},
|
{deps,[{"otpr","sophia",{9,0,0}},
|
||||||
{"otpr","gmserialization",{0,1,3}},
|
{"otpr","gmserialization",{0,1,3}},
|
||||||
{"otpr","gmbytecode",{3,4,1}},
|
{"otpr","gmbytecode",{3,4,1}},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user