Deployed 8897cc6 to master with MkDocs 1.2.4 and mike 1.0.1
This commit is contained in:
+95
-96
@@ -394,81 +394,80 @@
|
||||
Sophia contracts and a suitable JSON encoding of contract
|
||||
interface. As yet the interface is very basic.</p>
|
||||
<p>Encoding this contract:</p>
|
||||
<div class="highlight"><pre><span></span><code>contract Answers =
|
||||
<p>```
|
||||
contract Answers =
|
||||
record state = { a : answers }
|
||||
type answers() = map(string, int)
|
||||
|
||||
stateful function init() = { a = {} }
|
||||
type answers() = map(string, int)</p>
|
||||
<p>stateful function init() = { a = {} }
|
||||
private function the_answer() = 42
|
||||
function new_answer(q : string, a : int) : answers() = { [q] = a }
|
||||
</code></pre></div>
|
||||
```</p>
|
||||
<p>generates the following JSON structure representing the contract interface:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"contract"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"functions"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"init"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"returns"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Answers.state"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"stateful"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"q"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"a"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"int"</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">],</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"new_answer"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"returns"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"map"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="s2">"int"</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"stateful"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">],</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Answers"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"state"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"record"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"a"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Answers.answers"</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"type_defs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"answers"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"typedef"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"map"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="s2">"int"</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nt">"vars"</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="p">}</span><span class="w"></span>
|
||||
</code></pre></div>
|
||||
<p><code>json
|
||||
{
|
||||
"contract": {
|
||||
"functions": [
|
||||
{
|
||||
"arguments": [],
|
||||
"name": "init",
|
||||
"returns": "Answers.state",
|
||||
"stateful": true
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"name": "q",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "a",
|
||||
"type": "int"
|
||||
}
|
||||
],
|
||||
"name": "new_answer",
|
||||
"returns": {
|
||||
"map": [
|
||||
"string",
|
||||
"int"
|
||||
]
|
||||
},
|
||||
"stateful": false
|
||||
}
|
||||
],
|
||||
"name": "Answers",
|
||||
"state": {
|
||||
"record": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "Answers.answers"
|
||||
}
|
||||
]
|
||||
},
|
||||
"type_defs": [
|
||||
{
|
||||
"name": "answers",
|
||||
"typedef": {
|
||||
"map": [
|
||||
"string",
|
||||
"int"
|
||||
]
|
||||
},
|
||||
"vars": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}</code></p>
|
||||
<p>When that encoding is decoded the following include definition is generated:</p>
|
||||
<div class="highlight"><pre><span></span><code>contract Answers =
|
||||
<p><code>contract Answers =
|
||||
record state = {a : Answers.answers}
|
||||
type answers = map(string, int)
|
||||
function init : () => Answers.state
|
||||
function new_answer : (string, int) => map(string, int)
|
||||
</code></pre></div>
|
||||
function new_answer : (string, int) => map(string, int)</code></p>
|
||||
<h3 id="types">Types</h3>
|
||||
<div class="highlight"><pre><span></span><code><span class="p">-</span><span class="ni">type</span><span class="w"> </span><span class="n">aci_type</span><span class="p">()</span><span class="w"> </span><span class="p">::</span><span class="w"> </span><span class="n">json</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">string</span><span class="p">.</span><span class="w"></span>
|
||||
<span class="p">-</span><span class="ni">type</span><span class="w"> </span><span class="n">json</span><span class="p">()</span><span class="w"> </span><span class="p">::</span><span class="w"> </span><span class="nn">jsx</span><span class="p">:</span><span class="nf">json_term</span><span class="p">().</span><span class="w"></span>
|
||||
<span class="p">-</span><span class="ni">type</span><span class="w"> </span><span class="n">json_text</span><span class="p">()</span><span class="w"> </span><span class="p">::</span><span class="w"> </span><span class="n">binary</span><span class="p">().</span><span class="w"></span>
|
||||
</code></pre></div>
|
||||
<p><code>erlang
|
||||
-type aci_type() :: json | string.
|
||||
-type json() :: jsx:json_term().
|
||||
-type json_text() :: binary().</code></p>
|
||||
<h3 id="exports">Exports</h3>
|
||||
<h4 id="contract_interfaceaci_type-string-ok-json-string-error-term">contract_interface(aci_type(), string()) -> {ok, json() | string()} | {error, term()}</h4>
|
||||
<p>Generate the JSON encoding of the interface to a contract. The type definitions
|
||||
@@ -482,36 +481,36 @@ called <code>aci_test.aes</code> contains the contract in the description from w
|
||||
want to generate files <code>aci_test.json</code> which is the JSON encoding of the
|
||||
contract interface and <code>aci_test.include</code> which is the contract definition to
|
||||
be included inside another contract.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="mi">1</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="nv">Contract</span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">file</span><span class="p">:</span><span class="nf">read_file</span><span class="p">(</span><span class="s">"aci_test.aes"</span><span class="p">).</span><span class="w"></span>
|
||||
<span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="o"><<</span><span class="s">"contract Answers =</span><span class="se">\n</span><span class="s"> record state = { a : answers }</span><span class="se">\n</span><span class="s"> type answers() = map(string, int)</span><span class="se">\n\n</span><span class="s"> stateful function"</span><span class="p">...</span><span class="o">>></span><span class="p">}</span><span class="w"></span>
|
||||
<span class="mi">2</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="nv">JsonACI</span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">aeso_aci</span><span class="p">:</span><span class="nf">contract_interface</span><span class="p">(</span><span class="n">json</span><span class="p">,</span><span class="w"> </span><span class="nv">Contract</span><span class="p">).</span><span class="w"></span>
|
||||
<span class="p">{</span><span class="n">ok</span><span class="p">,[#{</span><span class="n">contract</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">#{</span><span class="n">functions</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">[#{</span><span class="n">arguments</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">[],</span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"init"</span><span class="o">>></span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">returns</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"Answers.state"</span><span class="o">>></span><span class="p">,</span><span class="n">stateful</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">true</span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">#{</span><span class="n">arguments</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">[#{</span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"q"</span><span class="o">>></span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"string"</span><span class="o">>></span><span class="p">},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">#{</span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"a"</span><span class="o">>></span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"int"</span><span class="o">>></span><span class="p">}],</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"new_answer"</span><span class="o">>></span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">returns</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">#{</span><span class="o"><<</span><span class="s">"map"</span><span class="o">>></span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">[</span><span class="o"><<</span><span class="s">"string"</span><span class="o">>></span><span class="p">,</span><span class="o"><<</span><span class="s">"int"</span><span class="o">>></span><span class="p">]},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">stateful</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">false</span><span class="p">}],</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"Answers"</span><span class="o">>></span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">state</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">#{</span><span class="n">record</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">[#{</span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"a"</span><span class="o">>></span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"Answers.answers"</span><span class="o">>></span><span class="p">}]},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">type_defs</span><span class="w"> </span><span class="o">=></span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">[#{</span><span class="n">name</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o"><<</span><span class="s">"answers"</span><span class="o">>></span><span class="p">,</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">typedef</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">#{</span><span class="o"><<</span><span class="s">"map"</span><span class="o">>></span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">[</span><span class="o"><<</span><span class="s">"string"</span><span class="o">>></span><span class="p">,</span><span class="o"><<</span><span class="s">"int"</span><span class="o">>></span><span class="p">]},</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">vars</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">[]}]}}]}</span><span class="w"></span>
|
||||
<span class="mi">3</span><span class="o">></span><span class="w"> </span><span class="nn">file</span><span class="p">:</span><span class="nf">write_file</span><span class="p">(</span><span class="s">"aci_test.aci"</span><span class="p">,</span><span class="w"> </span><span class="nn">jsx</span><span class="p">:</span><span class="nf">encode</span><span class="p">(</span><span class="nv">JsonACI</span><span class="p">)).</span><span class="w"></span>
|
||||
<span class="n">ok</span><span class="w"></span>
|
||||
<span class="mi">4</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="nv">InterfaceStub</span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">aeso_aci</span><span class="p">:</span><span class="nf">render_aci_json</span><span class="p">(</span><span class="nv">JsonACI</span><span class="p">).</span><span class="w"></span>
|
||||
<span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="o"><<</span><span class="s">"contract Answers =</span><span class="se">\n</span><span class="s"> record state = {a : Answers.answers}</span><span class="se">\n</span><span class="s"> type answers = map(string, int)</span><span class="se">\n</span><span class="s"> function init "</span><span class="p">...</span><span class="o">>></span><span class="p">}</span><span class="w"></span>
|
||||
<span class="mi">5</span><span class="o">></span><span class="w"> </span><span class="nn">file</span><span class="p">:</span><span class="nf">write_file</span><span class="p">(</span><span class="s">"aci_test.include"</span><span class="p">,</span><span class="w"> </span><span class="nv">InterfaceStub</span><span class="p">).</span><span class="w"></span>
|
||||
<span class="n">ok</span><span class="w"></span>
|
||||
<span class="mi">6</span><span class="o">></span><span class="w"> </span><span class="nn">jsx</span><span class="p">:</span><span class="nf">prettify</span><span class="p">(</span><span class="nn">jsx</span><span class="p">:</span><span class="nf">encode</span><span class="p">(</span><span class="nv">JsonACI</span><span class="p">)).</span><span class="w"></span>
|
||||
<span class="o"><<</span><span class="s">"[</span><span class="se">\n</span><span class="s"> {</span><span class="se">\n</span><span class="s"> </span><span class="se">\"</span><span class="s">contract</span><span class="se">\"</span><span class="s">: {</span><span class="se">\n</span><span class="s"> </span><span class="se">\"</span><span class="s">functions</span><span class="se">\"</span><span class="s">: [</span><span class="se">\n</span><span class="s"> {</span><span class="se">\n</span><span class="s"> </span><span class="se">\"</span><span class="s">arguments</span><span class="se">\"</span><span class="s">: [],</span><span class="se">\n</span><span class="s"> </span><span class="se">\"</span><span class="s">name</span><span class="se">\"</span><span class="s">: </span><span class="se">\"</span><span class="s">init</span><span class="se">\"</span><span class="s">,</span><span class="se">\n</span><span class="s"> "</span><span class="p">...</span><span class="o">>></span><span class="w"></span>
|
||||
</code></pre></div>
|
||||
<p><code>erlang
|
||||
1> {ok,Contract} = file:read_file("aci_test.aes").
|
||||
{ok,<<"contract Answers =\n record state = { a : answers }\n type answers() = map(string, int)\n\n stateful function"...>>}
|
||||
2> {ok,JsonACI} = aeso_aci:contract_interface(json, Contract).
|
||||
{ok,[#{contract =>
|
||||
#{functions =>
|
||||
[#{arguments => [],name => <<"init">>,
|
||||
returns => <<"Answers.state">>,stateful => true},
|
||||
#{arguments =>
|
||||
[#{name => <<"q">>,type => <<"string">>},
|
||||
#{name => <<"a">>,type => <<"int">>}],
|
||||
name => <<"new_answer">>,
|
||||
returns => #{<<"map">> => [<<"string">>,<<"int">>]},
|
||||
stateful => false}],
|
||||
name => <<"Answers">>,
|
||||
state =>
|
||||
#{record =>
|
||||
[#{name => <<"a">>,type => <<"Answers.answers">>}]},
|
||||
type_defs =>
|
||||
[#{name => <<"answers">>,
|
||||
typedef => #{<<"map">> => [<<"string">>,<<"int">>]},
|
||||
vars => []}]}}]}
|
||||
3> file:write_file("aci_test.aci", jsx:encode(JsonACI)).
|
||||
ok
|
||||
4> {ok,InterfaceStub} = aeso_aci:render_aci_json(JsonACI).
|
||||
{ok,<<"contract Answers =\n record state = {a : Answers.answers}\n type answers = map(string, int)\n function init "...>>}
|
||||
5> file:write_file("aci_test.include", InterfaceStub).
|
||||
ok
|
||||
6> jsx:prettify(jsx:encode(JsonACI)).
|
||||
<<"[\n {\n \"contract\": {\n \"functions\": [\n {\n \"arguments\": [],\n \"name\": \"init\",\n "...>></code></p>
|
||||
<p>The final call to <code>jsx:prettify(jsx:encode(JsonACI))</code> returns the encoding in a
|
||||
more easily readable form. This is what is shown in the description above.</p>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user