Deployed 8897cc6 to master with MkDocs 1.2.4 and mike 1.0.1

This commit is contained in:
GitHub Action
2022-04-26 17:10:38 +00:00
parent 01a40e6baf
commit d897007640
10 changed files with 848 additions and 1144 deletions
+95 -96
View File
@@ -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">&quot;contract&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;functions&quot;</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">&quot;arguments&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;init&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;returns&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Answers.state&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;stateful&quot;</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">&quot;arguments&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;q&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;int&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;new_answer&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;returns&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;map&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="s2">&quot;int&quot;</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">&quot;stateful&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Answers&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;state&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;record&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Answers.answers&quot;</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">&quot;type_defs&quot;</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">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;answers&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;typedef&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nt">&quot;map&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="s2">&quot;int&quot;</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">&quot;vars&quot;</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 : () =&gt; Answers.state
function new_answer : (string, int) =&gt; map(string, int)
</code></pre></div>
function new_answer : (string, int) =&gt; 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()) -&gt; {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">&gt;</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">&quot;aci_test.aes&quot;</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">&lt;&lt;</span><span class="s">&quot;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&quot;</span><span class="p">...</span><span class="o">&gt;&gt;</span><span class="p">}</span><span class="w"></span>
<span class="mi">2</span><span class="o">&gt;</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">=&gt;</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">=&gt;</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">=&gt;</span><span class="w"> </span><span class="p">[],</span><span class="n">name</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;init&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;Answers.state&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="n">stateful</span><span class="w"> </span><span class="o">=&gt;</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">=&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;q&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;string&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;a&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;int&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;new_answer&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="p">#{</span><span class="o">&lt;&lt;</span><span class="s">&quot;map&quot;</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">[</span><span class="o">&lt;&lt;</span><span class="s">&quot;string&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="o">&lt;&lt;</span><span class="s">&quot;int&quot;</span><span class="o">&gt;&gt;</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">=&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;Answers&quot;</span><span class="o">&gt;&gt;</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">=&gt;</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">=&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;a&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="n">type</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;Answers.answers&quot;</span><span class="o">&gt;&gt;</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">=&gt;</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">=&gt;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="s">&quot;answers&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="p">#{</span><span class="o">&lt;&lt;</span><span class="s">&quot;map&quot;</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">[</span><span class="o">&lt;&lt;</span><span class="s">&quot;string&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="o">&lt;&lt;</span><span class="s">&quot;int&quot;</span><span class="o">&gt;&gt;</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">=&gt;</span><span class="w"> </span><span class="p">[]}]}}]}</span><span class="w"></span>
<span class="mi">3</span><span class="o">&gt;</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">&quot;aci_test.aci&quot;</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">&gt;</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">&lt;&lt;</span><span class="s">&quot;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 &quot;</span><span class="p">...</span><span class="o">&gt;&gt;</span><span class="p">}</span><span class="w"></span>
<span class="mi">5</span><span class="o">&gt;</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">&quot;aci_test.include&quot;</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">&gt;</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">&lt;&lt;</span><span class="s">&quot;[</span><span class="se">\n</span><span class="s"> {</span><span class="se">\n</span><span class="s"> </span><span class="se">\&quot;</span><span class="s">contract</span><span class="se">\&quot;</span><span class="s">: {</span><span class="se">\n</span><span class="s"> </span><span class="se">\&quot;</span><span class="s">functions</span><span class="se">\&quot;</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">\&quot;</span><span class="s">arguments</span><span class="se">\&quot;</span><span class="s">: [],</span><span class="se">\n</span><span class="s"> </span><span class="se">\&quot;</span><span class="s">name</span><span class="se">\&quot;</span><span class="s">: </span><span class="se">\&quot;</span><span class="s">init</span><span class="se">\&quot;</span><span class="s">,</span><span class="se">\n</span><span class="s"> &quot;</span><span class="p">...</span><span class="o">&gt;&gt;</span><span class="w"></span>
</code></pre></div>
<p><code>erlang
1&gt; {ok,Contract} = file:read_file("aci_test.aes").
{ok,&lt;&lt;"contract Answers =\n record state = { a : answers }\n type answers() = map(string, int)\n\n stateful function"...&gt;&gt;}
2&gt; {ok,JsonACI} = aeso_aci:contract_interface(json, Contract).
{ok,[#{contract =&gt;
#{functions =&gt;
[#{arguments =&gt; [],name =&gt; &lt;&lt;"init"&gt;&gt;,
returns =&gt; &lt;&lt;"Answers.state"&gt;&gt;,stateful =&gt; true},
#{arguments =&gt;
[#{name =&gt; &lt;&lt;"q"&gt;&gt;,type =&gt; &lt;&lt;"string"&gt;&gt;},
#{name =&gt; &lt;&lt;"a"&gt;&gt;,type =&gt; &lt;&lt;"int"&gt;&gt;}],
name =&gt; &lt;&lt;"new_answer"&gt;&gt;,
returns =&gt; #{&lt;&lt;"map"&gt;&gt; =&gt; [&lt;&lt;"string"&gt;&gt;,&lt;&lt;"int"&gt;&gt;]},
stateful =&gt; false}],
name =&gt; &lt;&lt;"Answers"&gt;&gt;,
state =&gt;
#{record =&gt;
[#{name =&gt; &lt;&lt;"a"&gt;&gt;,type =&gt; &lt;&lt;"Answers.answers"&gt;&gt;}]},
type_defs =&gt;
[#{name =&gt; &lt;&lt;"answers"&gt;&gt;,
typedef =&gt; #{&lt;&lt;"map"&gt;&gt; =&gt; [&lt;&lt;"string"&gt;&gt;,&lt;&lt;"int"&gt;&gt;]},
vars =&gt; []}]}}]}
3&gt; file:write_file("aci_test.aci", jsx:encode(JsonACI)).
ok
4&gt; {ok,InterfaceStub} = aeso_aci:render_aci_json(JsonACI).
{ok,&lt;&lt;"contract Answers =\n record state = {a : Answers.answers}\n type answers = map(string, int)\n function init "...&gt;&gt;}
5&gt; file:write_file("aci_test.include", InterfaceStub).
ok
6&gt; jsx:prettify(jsx:encode(JsonACI)).
&lt;&lt;"[\n {\n \"contract\": {\n \"functions\": [\n {\n \"arguments\": [],\n \"name\": \"init\",\n "...&gt;&gt;</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>