This commit is contained in:
sagie gur ari 2020-06-06 14:29:03 +00:00
parent 9cd94fe06a
commit 785fd31ec8
18 changed files with 286 additions and 36 deletions

View file

@ -1,6 +1,6 @@
## CHANGELOG
### v0.4.3
### v0.5.0 (2020-06-06)
* Fixed end command bug which directed execution to wrong sub command when multiple script contexts are running #110
* Runtime - Fixed spread expansion with control characters #109

View file

@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `parser` mod in crate `duckscript`."><meta name="keywords" content="rust, rustlang, rust-lang, parser"><title>duckscript::parser - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../duckscript/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Module parser</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#functions">Functions</a></li></ul></div><p class='location'><a href='../index.html'>duckscript</a></p><script>window.sidebarCurrent = {name: 'parser', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>&#x2212;</span>]</a></span><a class='srclink' href='../../src/duckscript/parser.rs.html#1-469' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../index.html'>duckscript</a>::<wbr><a class="mod" href=''>parser</a></span></h1><div class='docblock'><h1 id="parser" class="section-header"><a href="#parser">parser</a></h1>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `parser` mod in crate `duckscript`."><meta name="keywords" content="rust, rustlang, rust-lang, parser"><title>duckscript::parser - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../duckscript/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a><p class='location'>Module parser</p><div class="sidebar-elems"><div class="block items"><ul><li><a href="#functions">Functions</a></li></ul></div><p class='location'><a href='../index.html'>duckscript</a></p><script>window.sidebarCurrent = {name: 'parser', ty: 'mod', relpath: '../'};</script><script defer src="../sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class='fqn'><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>&#x2212;</span>]</a></span><a class='srclink' href='../../src/duckscript/parser.rs.html#1-510' title='goto source code'>[src]</a></span><span class='in-band'>Module <a href='../index.html'>duckscript</a>::<wbr><a class="mod" href=''>parser</a></span></h1><div class='docblock'><h1 id="parser" class="section-header"><a href="#parser">parser</a></h1>
<p>The duck script parser.</p>
</div><h2 id='functions' class='section-header'><a href="#functions">Functions</a></h2>
<table><tr class='module-item'><td><a class="fn" href="fn.parse_file.html" title='duckscript::parser::parse_file fn'>parse_file</a></td><td class='docblock-short'><p>parses the file and returns a vector of instructions</p>

File diff suppressed because one or more lines are too long

View file

@ -228,7 +228,7 @@
<span class="ident">ExpandedValue</span>::<span class="ident">Single</span>(<span class="ident">value_string</span>.<span class="ident">to_string</span>())
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="ident">chars</span> <span class="op">=</span> <span class="ident">value_string</span>.<span class="ident">to_string</span>().<span class="ident">chars</span>().<span class="ident">collect</span>();
<span class="kw">match</span> <span class="ident">parser</span>::<span class="ident">parse_arguments</span>(<span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">chars</span>, <span class="number">0</span>) {
<span class="kw">match</span> <span class="ident">parser</span>::<span class="ident">reparse_arguments</span>(<span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">chars</span>, <span class="number">0</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">values_option</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">values_option</span> {
<span class="prelude-val">Some</span>(<span class="ident">values</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">ExpandedValue</span>::<span class="ident">Multi</span>(<span class="ident">values</span>),
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">ExpandedValue</span>::<span class="prelude-val">None</span>,

View file

@ -467,6 +467,47 @@
<span id="467">467</span>
<span id="468">468</span>
<span id="469">469</span>
<span id="470">470</span>
<span id="471">471</span>
<span id="472">472</span>
<span id="473">473</span>
<span id="474">474</span>
<span id="475">475</span>
<span id="476">476</span>
<span id="477">477</span>
<span id="478">478</span>
<span id="479">479</span>
<span id="480">480</span>
<span id="481">481</span>
<span id="482">482</span>
<span id="483">483</span>
<span id="484">484</span>
<span id="485">485</span>
<span id="486">486</span>
<span id="487">487</span>
<span id="488">488</span>
<span id="489">489</span>
<span id="490">490</span>
<span id="491">491</span>
<span id="492">492</span>
<span id="493">493</span>
<span id="494">494</span>
<span id="495">495</span>
<span id="496">496</span>
<span id="497">497</span>
<span id="498">498</span>
<span id="499">499</span>
<span id="500">500</span>
<span id="501">501</span>
<span id="502">502</span>
<span id="503">503</span>
<span id="504">504</span>
<span id="505">505</span>
<span id="506">506</span>
<span id="507">507</span>
<span id="508">508</span>
<span id="509">509</span>
<span id="510">510</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="doccomment">//! # parser</span>
<span class="doccomment">//!</span>
@ -665,12 +706,29 @@
<span class="ident">meta_info</span>: <span class="kw-2">&amp;</span><span class="ident">InstructionMetaInfo</span>,
<span class="ident">line_text</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">char</span><span class="op">&gt;</span>,
<span class="ident">start_index</span>: <span class="ident">usize</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>, <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="ident">parse_arguments_with_options</span>(<span class="ident">meta_info</span>, <span class="ident">line_text</span>, <span class="ident">start_index</span>, <span class="bool-val">false</span>)
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">reparse_arguments</span>(
<span class="ident">meta_info</span>: <span class="kw-2">&amp;</span><span class="ident">InstructionMetaInfo</span>,
<span class="ident">line_text</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">char</span><span class="op">&gt;</span>,
<span class="ident">start_index</span>: <span class="ident">usize</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>, <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="ident">parse_arguments_with_options</span>(<span class="ident">meta_info</span>, <span class="ident">line_text</span>, <span class="ident">start_index</span>, <span class="bool-val">true</span>)
}
<span class="kw">fn</span> <span class="ident">parse_arguments_with_options</span>(
<span class="ident">meta_info</span>: <span class="kw-2">&amp;</span><span class="ident">InstructionMetaInfo</span>,
<span class="ident">line_text</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">char</span><span class="op">&gt;</span>,
<span class="ident">start_index</span>: <span class="ident">usize</span>,
<span class="ident">control_as_char</span>: <span class="ident">bool</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>, <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">arguments</span> <span class="op">=</span> <span class="macro">vec</span><span class="macro">!</span>[];
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">index</span> <span class="op">=</span> <span class="ident">start_index</span>;
<span class="kw">loop</span> {
<span class="kw">match</span> <span class="ident">parse_next_argument</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>) {
<span class="kw">match</span> <span class="ident">parse_next_argument</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>, <span class="ident">control_as_char</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">output</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">next_index</span>, <span class="ident">argument</span>) <span class="op">=</span> <span class="ident">output</span>;
@ -696,8 +754,17 @@
<span class="ident">meta_info</span>: <span class="kw-2">&amp;</span><span class="ident">InstructionMetaInfo</span>,
<span class="ident">line_text</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">char</span><span class="op">&gt;</span>,
<span class="ident">start_index</span>: <span class="ident">usize</span>,
<span class="ident">control_as_char</span>: <span class="ident">bool</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">usize</span>, <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>), <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="ident">parse_next_value</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">start_index</span>, <span class="bool-val">true</span>, <span class="bool-val">true</span>, <span class="bool-val">false</span>)
<span class="ident">parse_next_value</span>(
<span class="kw-2">&amp;</span><span class="ident">meta_info</span>,
<span class="kw-2">&amp;</span><span class="ident">line_text</span>,
<span class="ident">start_index</span>,
<span class="bool-val">true</span>,
<span class="op">!</span><span class="ident">control_as_char</span>,
<span class="bool-val">false</span>,
<span class="ident">control_as_char</span>,
)
}
<span class="kw">fn</span> <span class="ident">parse_next_value</span>(
@ -707,6 +774,7 @@
<span class="ident">allow_quotes</span>: <span class="ident">bool</span>,
<span class="ident">allow_control</span>: <span class="ident">bool</span>,
<span class="ident">stop_on_equals</span>: <span class="ident">bool</span>,
<span class="ident">control_as_char</span>: <span class="ident">bool</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">usize</span>, <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>), <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">end_index</span> <span class="op">=</span> <span class="ident">line_text</span>.<span class="ident">len</span>();
@ -756,7 +824,9 @@
});
}
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">character</span> <span class="op">=</span><span class="op">=</span> <span class="string">&#39;\\&#39;</span> {
<span class="kw">if</span> <span class="ident">allow_control</span> {
<span class="kw">if</span> <span class="ident">control_as_char</span> {
<span class="ident">argument</span>.<span class="ident">push</span>(<span class="ident">character</span>);
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">allow_control</span> {
<span class="ident">in_control</span> <span class="op">=</span> <span class="bool-val">true</span>;
<span class="ident">found_variable_prefix</span> <span class="op">=</span> <span class="bool-val">false</span>;
} <span class="kw">else</span> {
@ -797,7 +867,9 @@
});
}
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">character</span> <span class="op">=</span><span class="op">=</span> <span class="string">&#39;\\&#39;</span> {
<span class="kw">if</span> <span class="ident">allow_control</span> {
<span class="kw">if</span> <span class="ident">control_as_char</span> {
<span class="ident">argument</span>.<span class="ident">push</span>(<span class="ident">character</span>);
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">allow_control</span> {
<span class="ident">in_control</span> <span class="op">=</span> <span class="bool-val">true</span>;
} <span class="kw">else</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ScriptError</span> {
@ -849,7 +921,7 @@
<span class="ident">index</span> <span class="op">=</span> <span class="ident">index</span> <span class="op">+</span> <span class="number">1</span>;
<span class="kw">if</span> <span class="ident">character</span> <span class="op">=</span><span class="op">=</span> <span class="ident">LABEL_PREFIX</span> {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">output</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">next_index</span>, <span class="ident">value</span>) <span class="op">=</span> <span class="ident">output</span>;
<span class="ident">index</span> <span class="op">=</span> <span class="ident">next_index</span>;
@ -891,7 +963,15 @@
<span class="ident">start_index</span>: <span class="ident">usize</span>,
<span class="ident">instruction</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">ScriptInstruction</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">usize</span>, <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">start_index</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">true</span>) {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(
<span class="kw-2">&amp;</span><span class="ident">meta_info</span>,
<span class="kw-2">&amp;</span><span class="ident">line_text</span>,
<span class="ident">start_index</span>,
<span class="bool-val">false</span>,
<span class="bool-val">false</span>,
<span class="bool-val">true</span>,
<span class="bool-val">false</span>,
) {
<span class="prelude-val">Ok</span>(<span class="ident">output</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">next_index</span>, <span class="ident">value</span>) <span class="op">=</span> <span class="ident">output</span>;
@ -914,7 +994,9 @@
}
<span class="kw">if</span> <span class="ident">instruction</span>.<span class="ident">output</span>.<span class="ident">is_some</span>() {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) {
<span class="kw">match</span> <span class="ident">parse_next_value</span>(
<span class="kw-2">&amp;</span><span class="ident">meta_info</span>, <span class="kw-2">&amp;</span><span class="ident">line_text</span>, <span class="ident">index</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>,
) {
<span class="prelude-val">Ok</span>(<span class="ident">output</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">next_index</span>, <span class="ident">value</span>) <span class="op">=</span> <span class="ident">output</span>;

View file

@ -1,4 +1,4 @@
var searchIndex = JSON.parse('{\
"duck":{"doc":"duckscript_cli","i":[[5,"main","duck","",null,[[]]],[5,"run_cli","","",null,[[],[["scripterror",3],["result",4]]]],[5,"create_context","","",null,[[],[["scripterror",3],["result",4],["context",3]]]],[5,"run_script","","",null,[[],[["scripterror",3],["result",4]]]],[5,"run_repl","","",null,[[],[["scripterror",3],["result",4]]]],[7,"VERSION","","",null,null],[7,"AUTHOR","","",null,null],[7,"DESCRIPTION","","",null,null]],"p":[]}\
"duck":{"doc":"duckscript_cli","i":[[5,"main","duck","",null,[[]]],[5,"run_cli","","",null,[[],[["result",4],["scripterror",3]]]],[5,"create_context","","",null,[[],[["result",4],["context",3],["scripterror",3]]]],[5,"run_script","","",null,[[],[["result",4],["scripterror",3]]]],[5,"run_repl","","",null,[[],[["result",4],["scripterror",3]]]],[7,"VERSION","","",null,null],[7,"AUTHOR","","",null,null],[7,"DESCRIPTION","","",null,null]],"p":[]}\
}');
addSearchOptions(searchIndex);initSearch(searchIndex);

View file

@ -1,4 +1,4 @@
var searchIndex = JSON.parse('{\
"duckscriptsdk":{"doc":"duckscript_sdk","i":[[5,"version","duckscriptsdk","Returns the library version.",null,[[],["string",3]]],[5,"load","","Loads all core commands",null,[[["commands",3]],[["scripterror",3],["result",4]]]]],"p":[]}\
"duckscriptsdk":{"doc":"duckscript_sdk","i":[[5,"version","duckscriptsdk","Returns the library version.",null,[[],["string",3]]],[5,"load","","Loads all core commands",null,[[["commands",3]],[["result",4],["scripterror",3]]]]],"p":[]}\
}');
addSearchOptions(searchIndex);initSearch(searchIndex);

View file

@ -98,7 +98,10 @@
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::<span class="ident">get_line_key</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::<span class="ident">get_core_sub_state_for_command</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">runner</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">command</span>::{<span class="ident">Command</span>, <span class="ident">CommandResult</span>, <span class="ident">Commands</span>};
@ -116,9 +119,9 @@
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">static</span> <span class="ident">END_COMMAND_NAME</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;end&quot;</span>;
<span class="kw">fn</span> <span class="ident">get_command</span>(<span class="ident">line</span>: <span class="ident">usize</span>, <span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_line_key</span>(<span class="ident">line</span>, <span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">sub_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_command</span>(<span class="ident">state</span>, <span class="ident">END_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">line</span>.<span class="ident">to_string</span>();
<span class="kw">match</span> <span class="ident">sub_state</span>.<span class="ident">get</span>(<span class="kw-2">&amp;</span><span class="ident">key</span>) {
<span class="prelude-val">Some</span>(<span class="ident">state_value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">state_value</span> {
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">command</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="ident">command</span>.<span class="ident">clone</span>()),
@ -134,9 +137,10 @@
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">set_command</span>(<span class="ident">line</span>: <span class="ident">usize</span>, <span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>, <span class="ident">command</span>: <span class="ident">String</span>) {
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_line_key</span>(<span class="ident">line</span>, <span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">sub_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_command</span>(<span class="ident">state</span>, <span class="ident">END_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="ident">sub_state</span>.<span class="ident">insert</span>(<span class="ident">line</span>.<span class="ident">to_string</span>(), <span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">command</span>));
<span class="ident">sub_state</span>.<span class="ident">insert</span>(<span class="ident">key</span>, <span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">command</span>));
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>

View file

@ -429,7 +429,7 @@
<span id="429">429</span>
<span id="430">430</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::{<span class="ident">end</span>, <span class="ident">function</span>, <span class="ident">ifelse</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::{<span class="ident">end</span>, <span class="ident">function</span>, <span class="ident">get_line_key</span>, <span class="ident">ifelse</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::{
<span class="ident">get_as_string</span>, <span class="ident">get_core_sub_state_for_command</span>, <span class="ident">get_handle</span>, <span class="ident">get_list</span>, <span class="ident">get_sub_state</span>,
};
@ -593,10 +593,10 @@
<span class="ident">instructions</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Instruction</span><span class="op">&gt;</span>,
<span class="ident">package</span>: <span class="ident">String</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">ForInMetaInfo</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_line_key</span>(<span class="ident">line</span>, <span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">forin_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_command</span>(<span class="ident">state</span>, <span class="ident">FORIN_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="kw">let</span> <span class="ident">forin_meta_info_state</span> <span class="op">=</span> <span class="ident">get_sub_state</span>(<span class="ident">META_INFO_STATE_KEY</span>.<span class="ident">to_string</span>(), <span class="ident">forin_state</span>);
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">line</span>.<span class="ident">to_string</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">forin_state_for_line</span> <span class="op">=</span> <span class="ident">get_sub_state</span>(<span class="ident">key</span>.<span class="ident">clone</span>(), <span class="ident">forin_meta_info_state</span>);
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">deserialize_forin_meta_info</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">forin_state_for_line</span>) {

View file

@ -534,8 +534,34 @@
<span id="534">534</span>
<span id="535">535</span>
<span id="536">536</span>
<span id="537">537</span>
<span id="538">538</span>
<span id="539">539</span>
<span id="540">540</span>
<span id="541">541</span>
<span id="542">542</span>
<span id="543">543</span>
<span id="544">544</span>
<span id="545">545</span>
<span id="546">546</span>
<span id="547">547</span>
<span id="548">548</span>
<span id="549">549</span>
<span id="550">550</span>
<span id="551">551</span>
<span id="552">552</span>
<span id="553">553</span>
<span id="554">554</span>
<span id="555">555</span>
<span id="556">556</span>
<span id="557">557</span>
<span id="558">558</span>
<span id="559">559</span>
<span id="560">560</span>
<span id="561">561</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::{<span class="ident">end</span>, <span class="ident">forin</span>, <span class="ident">ifelse</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">types</span>::<span class="ident">scope</span>::<span class="ident">get_line_context_name</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::{<span class="ident">get_core_sub_state_for_command</span>, <span class="ident">get_list</span>, <span class="ident">get_sub_state</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::{<span class="ident">instruction_query</span>, <span class="ident">pckg</span>};
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">command</span>::{<span class="ident">Command</span>, <span class="ident">CommandResult</span>, <span class="ident">Commands</span>, <span class="ident">GoToValue</span>};
@ -564,6 +590,7 @@
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">call_line</span>: <span class="ident">usize</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">start_line</span>: <span class="ident">usize</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">end_line</span>: <span class="ident">usize</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">line_context_name</span>: <span class="ident">String</span>,
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">output_variable</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
@ -647,6 +674,10 @@
<span class="string">&quot;end_line&quot;</span>.<span class="ident">to_string</span>(),
<span class="ident">StateValue</span>::<span class="ident">UnsignedNumber</span>(<span class="ident">call_info</span>.<span class="ident">end_line</span>),
);
<span class="ident">sub_state</span>.<span class="ident">insert</span>(
<span class="string">&quot;line_context_name&quot;</span>.<span class="ident">to_string</span>(),
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">call_info</span>.<span class="ident">line_context_name</span>.<span class="ident">clone</span>()),
);
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">output_variable</span>) <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">call_info</span>.<span class="ident">output_variable</span> {
<span class="ident">sub_state</span>.<span class="ident">insert</span>(
<span class="string">&quot;output_variable&quot;</span>.<span class="ident">to_string</span>(),
@ -688,6 +719,14 @@
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="ident">pop_from_call_stack</span>(<span class="ident">state</span>),
};
<span class="kw">let</span> <span class="ident">line_context_name</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">sub_state</span>.<span class="ident">get</span>(<span class="string">&quot;line_context_name&quot;</span>) {
<span class="prelude-val">Some</span>(<span class="ident">value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">value</span> {
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">line_context_name</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">line_context_name</span>.<span class="ident">clone</span>(),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="ident">pop_from_call_stack</span>(<span class="ident">state</span>),
},
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="ident">pop_from_call_stack</span>(<span class="ident">state</span>),
};
<span class="kw">let</span> <span class="ident">output_variable</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">sub_state</span>.<span class="ident">get</span>(<span class="string">&quot;output_variable&quot;</span>) {
<span class="prelude-val">Some</span>(<span class="ident">value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">value</span> {
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">output_variable</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Some</span>(<span class="ident">output_variable</span>.<span class="ident">to_string</span>()),
@ -700,6 +739,7 @@
<span class="ident">call_line</span>,
<span class="ident">start_line</span>,
<span class="ident">end_line</span>,
<span class="ident">line_context_name</span>,
<span class="ident">output_variable</span>,
})
}
@ -727,11 +767,14 @@
<span class="ident">variables</span>.<span class="ident">insert</span>(<span class="ident">index</span>.<span class="ident">to_string</span>(), <span class="ident">argument</span>);
}
<span class="kw">let</span> <span class="ident">line_context_name</span> <span class="op">=</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>);
<span class="comment">// store to call stack</span>
<span class="kw">let</span> <span class="ident">call_info</span> <span class="op">=</span> <span class="ident">CallInfo</span> {
<span class="ident">call_line</span>: <span class="ident">line</span>,
<span class="ident">start_line</span>: <span class="ident">fn_info</span>.<span class="ident">start</span>,
<span class="ident">end_line</span>: <span class="ident">fn_info</span>.<span class="ident">end</span>,
<span class="ident">line_context_name</span>,
<span class="ident">output_variable</span>,
};
<span class="ident">push_to_call_stack</span>(<span class="ident">state</span>, <span class="kw-2">&amp;</span><span class="ident">call_info</span>);
@ -971,9 +1014,11 @@
<span class="ident">_commands</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Commands</span>,
<span class="ident">line</span>: <span class="ident">usize</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">CommandResult</span> {
<span class="kw">let</span> <span class="ident">line_context_name</span> <span class="op">=</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>);
<span class="kw">match</span> <span class="ident">pop_from_call_stack</span>(<span class="ident">state</span>) {
<span class="prelude-val">Some</span>(<span class="ident">call_info</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">call_info</span>.<span class="ident">end_line</span> <span class="op">=</span><span class="op">=</span> <span class="ident">line</span> {
<span class="kw">if</span> <span class="ident">call_info</span>.<span class="ident">end_line</span> <span class="op">=</span><span class="op">=</span> <span class="ident">line</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">call_info</span>.<span class="ident">line_context_name</span> <span class="op">=</span><span class="op">=</span> <span class="ident">line_context_name</span> {
<span class="kw">let</span> <span class="ident">next_line</span> <span class="op">=</span> <span class="ident">call_info</span>.<span class="ident">call_line</span> <span class="op">+</span> <span class="number">1</span>;
<span class="ident">CommandResult</span>::<span class="ident">GoTo</span>(<span class="prelude-val">None</span>, <span class="ident">GoToValue</span>::<span class="ident">Line</span>(<span class="ident">next_line</span>))
} <span class="kw">else</span> {
@ -1022,9 +1067,14 @@
<span class="ident">_commands</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Commands</span>,
<span class="ident">line</span>: <span class="ident">usize</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">CommandResult</span> {
<span class="kw">let</span> <span class="ident">line_context_name</span> <span class="op">=</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>);
<span class="kw">match</span> <span class="ident">pop_from_call_stack</span>(<span class="ident">state</span>) {
<span class="prelude-val">Some</span>(<span class="ident">call_info</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">call_info</span>.<span class="ident">start_line</span> <span class="op">&lt;</span> <span class="ident">line</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">call_info</span>.<span class="ident">end_line</span> <span class="op">&gt;</span> <span class="ident">line</span> {
<span class="kw">if</span> <span class="ident">call_info</span>.<span class="ident">start_line</span> <span class="op">&lt;</span> <span class="ident">line</span>
<span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">call_info</span>.<span class="ident">end_line</span> <span class="op">&gt;</span> <span class="ident">line</span>
<span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">call_info</span>.<span class="ident">line_context_name</span> <span class="op">=</span><span class="op">=</span> <span class="ident">line_context_name</span>
{
<span class="kw">match</span> <span class="ident">call_info</span>.<span class="ident">output_variable</span> {
<span class="prelude-val">Some</span>(<span class="ident">name</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">arguments</span>.<span class="ident">is_empty</span>() {

View file

@ -601,7 +601,7 @@
<span id="601">601</span>
<span id="602">602</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::{<span class="ident">end</span>, <span class="ident">forin</span>, <span class="ident">function</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">sdk</span>::<span class="ident">std</span>::<span class="ident">flowcontrol</span>::{<span class="ident">end</span>, <span class="ident">forin</span>, <span class="ident">function</span>, <span class="ident">get_line_key</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::{<span class="ident">get_core_sub_state_for_command</span>, <span class="ident">get_list</span>, <span class="ident">get_sub_state</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::{<span class="ident">condition</span>, <span class="ident">instruction_query</span>, <span class="ident">pckg</span>};
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">command</span>::{<span class="ident">Command</span>, <span class="ident">CommandResult</span>, <span class="ident">Commands</span>, <span class="ident">GoToValue</span>};
@ -826,10 +826,10 @@
<span class="ident">instructions</span>: <span class="kw-2">&amp;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Instruction</span><span class="op">&gt;</span>,
<span class="ident">package</span>: <span class="ident">String</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">IfElseMetaInfo</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_line_key</span>(<span class="ident">line</span>, <span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">if_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_command</span>(<span class="ident">state</span>, <span class="ident">IFELSE_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="kw">let</span> <span class="ident">if_meta_info_state</span> <span class="op">=</span> <span class="ident">get_sub_state</span>(<span class="ident">META_INFO_STATE_KEY</span>.<span class="ident">to_string</span>(), <span class="ident">if_state</span>);
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">line</span>.<span class="ident">to_string</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">if_state_for_line</span> <span class="op">=</span> <span class="ident">get_sub_state</span>(<span class="ident">key</span>.<span class="ident">clone</span>(), <span class="ident">if_meta_info_state</span>);
<span class="kw">let</span> <span class="ident">result</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">deserialize_ifelse_meta_info</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">if_state_for_line</span>) {

View file

@ -22,6 +22,17 @@
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">mod</span> <span class="ident">end</span>;
<span class="kw">mod</span> <span class="ident">forin</span>;
@ -29,12 +40,23 @@
<span class="kw">mod</span> <span class="ident">goto</span>;
<span class="kw">mod</span> <span class="ident">ifelse</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">types</span>::<span class="ident">scope</span>::<span class="ident">get_line_context_name</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">pckg</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">command</span>::<span class="ident">Commands</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">error</span>::<span class="ident">ScriptError</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">runtime</span>::<span class="ident">StateValue</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">collections</span>::<span class="ident">HashMap</span>;
<span class="kw">static</span> <span class="ident">PACKAGE</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;flowcontrol&quot;</span>;
<span class="kw">fn</span> <span class="ident">get_line_key</span>(<span class="ident">line</span>: <span class="ident">usize</span>, <span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>);
<span class="ident">key</span>.<span class="ident">push_str</span>(<span class="string">&quot;::&quot;</span>);
<span class="ident">key</span>.<span class="ident">push_str</span>(<span class="kw-2">&amp;</span><span class="ident">line</span>.<span class="ident">to_string</span>());
<span class="ident">key</span>
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">load</span>(<span class="ident">commands</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">Commands</span>, <span class="ident">parent</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">ScriptError</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">package</span> <span class="op">=</span> <span class="ident">pckg</span>::<span class="ident">concat</span>(<span class="ident">parent</span>, <span class="ident">PACKAGE</span>);

View file

@ -240,8 +240,12 @@
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">types</span>::<span class="ident">scope</span>::<span class="ident">clear</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">types</span>::<span class="ident">scope</span>::<span class="ident">set_line_context_name</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::{<span class="ident">get_handles_sub_state</span>, <span class="ident">put_handle</span>};
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">command</span>::{<span class="ident">Command</span>, <span class="ident">CommandResult</span>, <span class="ident">Commands</span>, <span class="ident">GoToValue</span>};
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">error</span>::<span class="ident">ScriptError</span>;
@ -334,6 +338,7 @@
<span class="ident">CommandResult</span>::<span class="ident">Error</span>(<span class="string">&quot;Invalid arguments provided.&quot;</span>.<span class="ident">to_string</span>())
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="ident">start_count</span> <span class="op">=</span> <span class="ident">variables</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">line_context_name</span> <span class="op">=</span> <span class="ident">set_line_context_name</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">scope_name</span>, <span class="ident">state</span>);
<span class="comment">// define script arguments</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">handle_option</span> <span class="op">=</span> <span class="prelude-val">None</span>;
@ -442,6 +447,7 @@
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> (),
}
<span class="ident">clear</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">scope_name</span>, <span class="ident">variables</span>);
<span class="ident">set_line_context_name</span>(<span class="kw-2">&amp;</span><span class="ident">line_context_name</span>, <span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">end_count</span> <span class="op">=</span> <span class="ident">variables</span>.<span class="ident">len</span>();
<span class="kw">if</span> <span class="ident">start_count</span> <span class="op">&lt;</span> <span class="ident">end_count</span> {

View file

@ -1,14 +1,82 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `duckscript_sdk/src/types/scope.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>scope.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../../normalize.css"><link rel="stylesheet" type="text/css" href="../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../../dark.css"><link rel="stylesheet" type="text/css" href="../../../light.css" id="themeStyle"><script src="../../../storage.js"></script><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../../duckscriptsdk/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../../settings.html"><img src="../../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
<span id="5">5</span>
<span id="6">6</span>
<span id="7">7</span>
<span id="8">8</span>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `duckscript_sdk/src/types/scope.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>scope.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../../normalize.css"><link rel="stylesheet" type="text/css" href="../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../../dark.css"><link rel="stylesheet" type="text/css" href="../../../light.css" id="themeStyle"><script src="../../../storage.js"></script><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../../duckscriptsdk/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../../settings.html"><img src="../../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">state</span>::<span class="ident">get_core_sub_state_for_runtime</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">runtime</span>::<span class="ident">StateValue</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">collections</span>::<span class="ident">HashMap</span>;
<span class="kw">static</span> <span class="ident">CONTEXT_NAME_SUB_STATE_KEY</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;line_context_name&quot;</span>;
<span class="kw">static</span> <span class="ident">CONTEXT_NAME_STATE_KEY</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;name&quot;</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="kw">let</span> <span class="ident">sub_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_runtime</span>(<span class="ident">state</span>, <span class="ident">CONTEXT_NAME_SUB_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="kw">match</span> <span class="ident">sub_state</span>.<span class="ident">get</span>(<span class="ident">CONTEXT_NAME_STATE_KEY</span>) {
<span class="prelude-val">Some</span>(<span class="ident">state_value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">state_value</span> {
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">value</span>.<span class="ident">clone</span>(),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// remove corrupted data</span>
<span class="ident">sub_state</span>.<span class="ident">remove</span>(<span class="ident">CONTEXT_NAME_STATE_KEY</span>);
<span class="string">&quot;&quot;</span>.<span class="ident">to_string</span>()
}
},
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="string">&quot;&quot;</span>.<span class="ident">to_string</span>(),
}
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">set_line_context_name</span>(<span class="ident">name</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="kw">let</span> <span class="ident">previous_name</span> <span class="op">=</span> <span class="ident">get_line_context_name</span>(<span class="ident">state</span>);
<span class="kw">let</span> <span class="ident">sub_state</span> <span class="op">=</span> <span class="ident">get_core_sub_state_for_runtime</span>(<span class="ident">state</span>, <span class="ident">CONTEXT_NAME_SUB_STATE_KEY</span>.<span class="ident">to_string</span>());
<span class="ident">sub_state</span>.<span class="ident">insert</span>(
<span class="ident">CONTEXT_NAME_STATE_KEY</span>.<span class="ident">to_string</span>(),
<span class="ident">StateValue</span>::<span class="ident">String</span>(<span class="ident">name</span>.<span class="ident">to_string</span>()),
);
<span class="ident">previous_name</span>
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">clear</span>(<span class="ident">name</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">variables</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">String</span><span class="op">&gt;</span>) {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">scope_name</span> <span class="op">=</span> <span class="ident">name</span>.<span class="ident">to_string</span>();
<span class="ident">scope_name</span>.<span class="ident">push_str</span>(<span class="string">&quot;::&quot;</span>);

View file

@ -375,6 +375,15 @@
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">utils</span>::<span class="ident">pckg</span>;
<span class="kw">use</span> <span class="ident">duckscript</span>::<span class="ident">types</span>::<span class="ident">runtime</span>::<span class="ident">StateValue</span>;
@ -389,11 +398,20 @@
<span class="kw">static</span> <span class="ident">HANDLE_SUB_STATE_KEY</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;handles&quot;</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">get_core_sub_state_for_runtime</span>(
<span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>,
<span class="ident">name</span>: <span class="ident">String</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">sub_state_name</span> <span class="op">=</span> <span class="ident">pckg</span>::<span class="ident">concat</span>(<span class="string">&quot;duckscriptsdk::runtime&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">name</span>);
<span class="ident">get_sub_state</span>(<span class="ident">sub_state_name</span>, <span class="ident">state</span>)
}
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">get_core_sub_state_for_command</span>(
<span class="ident">state</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span>,
<span class="ident">name</span>: <span class="ident">String</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">String</span>, <span class="ident">StateValue</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">sub_state_name</span> <span class="op">=</span> <span class="ident">pckg</span>::<span class="ident">concat</span>(<span class="string">&quot;duckscriptsdk&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">name</span>);
<span class="kw">let</span> <span class="ident">sub_state_name</span> <span class="op">=</span> <span class="ident">pckg</span>::<span class="ident">concat</span>(<span class="string">&quot;duckscriptsdk::command&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">name</span>);
<span class="ident">get_sub_state</span>(<span class="ident">sub_state_name</span>, <span class="ident">state</span>)
}

View file

@ -1,6 +1,6 @@
[package]
name = "duckscript"
version = "0.4.0"
version = "0.5.0"
authors = ["Sagie Gur-Ari <sagiegurari@gmail.com>"]
description = "Simple, extendable and embeddable scripting language."
license = "Apache-2.0"

View file

@ -1,6 +1,6 @@
[package]
name = "duckscript_cli"
version = "0.4.2"
version = "0.5.0"
authors = ["Sagie Gur-Ari <sagiegurari@gmail.com>"]
description = "The duckscript command line executable."
license = "Apache-2.0"
@ -27,8 +27,8 @@ name = "duck"
path = "src/main.rs"
[dependencies]
duckscript = { version = "^0.4.0", path = "../duckscript" }
duckscriptsdk = { version = "^0.4.2", path = "../duckscript_sdk" }
duckscript = { version = "^0.5.0", path = "../duckscript" }
duckscriptsdk = { version = "^0.5.0", path = "../duckscript_sdk" }
[badges.codecov]
branch = "master"

View file

@ -1,6 +1,6 @@
[package]
name = "duckscriptsdk"
version = "0.4.2"
version = "0.5.0"
authors = ["Sagie Gur-Ari <sagiegurari@gmail.com>"]
description = "The duckscript SDK."
license = "Apache-2.0"
@ -26,7 +26,7 @@ include = [
attohttpc = "^0.13"
base64 = "^0.12"
cfg-if = "^0.1"
duckscript = { version = "^0.4.0", path = "../duckscript" }
duckscript = { version = "^0.5.0", path = "../duckscript" }
fs_extra = "^1"
fsio = { version = "^0.1", features = ["temp-path"] }
glob = "^0.3"