From 0a1722b06d7d511c1de0b0b9d20818c7931eb37d Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 12:10:32 +0200 Subject: [PATCH 01/26] feat(rust): porting of @b1ek code --- src/compiler.rs | 3 --- src/modules/imports/import.rs | 32 +++++++++++++++++----------- src/modules/imports/import_string.rs | 6 ++---- src/stdlib.rs | 14 ++++++++++++ 4 files changed, 35 insertions(+), 20 deletions(-) create mode 100644 src/stdlib.rs diff --git a/src/compiler.rs b/src/compiler.rs index af19af7a..a2d7fbe2 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -173,7 +173,4 @@ impl AmberCompiler { }) } - pub fn import_std() -> String { - [include_str!("std/main.ab")].join("\n") - } } diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index c2c7b9ce..e1b1aeda 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -4,6 +4,7 @@ use heraclitus_compiler::prelude::*; use crate::compiler::AmberCompiler; use crate::modules::block::Block; use crate::modules::variable::variable_name_extensions; +use crate::stdlib; use crate::utils::context::{Context, FunctionDecl}; use crate::utils::{ParserMetadata, TranslateMetadata}; use crate::translate::module::TranslateModule; @@ -69,12 +70,22 @@ impl Import { } fn resolve_import(&mut self, meta: &ParserMetadata) -> Result { - match fs::read_to_string(self.path.value.clone()) { - Ok(content) => Ok(content), - Err(err) => error!(meta, self.token_path.clone() => { - message: format!("Could not read file '{}'", self.path.value), - comment: err.to_string() - }) + if self.path.value.starts_with("std") { + match stdlib::resolve_std(&self.path.value) { + Some(v) => Ok(v), + None => error!(meta, self.token_path.clone() => { + message: format!("Std module does not exist: {}", self.path.value), + comment: String::new() + }) + } + } else { + match fs::read_to_string(self.path.value.clone()) { + Ok(content) => Ok(content), + Err(err) => error!(meta, self.token_path.clone() => { + message: format!("Could not read file '{}'", self.path.value), + comment: err.to_string() + }) + } } } @@ -157,14 +168,9 @@ impl SyntaxModule for Import { self.token_path = meta.get_current_token(); syntax(meta, &mut self.path)?; // Import code from file or standard library - let imported_code = if self.path.value == "[standard library]" { - self.add_import(meta, "[standard library]")?; - AmberCompiler::import_std() - } else { - self.add_import(meta, &self.path.value.clone())?; - self.resolve_import(meta)? + self.add_import(meta, &self.path.value.clone())?; + let imported_code = self.resolve_import(meta)?; - }; self.handle_import(meta, imported_code)?; Ok(()) } diff --git a/src/modules/imports/import_string.rs b/src/modules/imports/import_string.rs index cceb4d75..e82e1456 100644 --- a/src/modules/imports/import_string.rs +++ b/src/modules/imports/import_string.rs @@ -9,10 +9,8 @@ pub struct ImportString { impl ImportString { fn resolve_path(&mut self, meta: &ParserMetadata, tok: Option) -> SyntaxResult { - if self.value == "std" { - self.value = "[standard library]".to_string(); + if self.value.starts_with("std") { return Ok(()) - } let mut path = meta.context.path.as_ref() .map_or_else(|| Path::new("."), |path| Path::new(path)) @@ -53,4 +51,4 @@ impl SyntaxModule for ImportString { } Ok(()) } -} \ No newline at end of file +} diff --git a/src/stdlib.rs b/src/stdlib.rs new file mode 100644 index 00000000..a378a8e1 --- /dev/null +++ b/src/stdlib.rs @@ -0,0 +1,14 @@ +use include_dir::{include_dir, Dir}; +pub const STDLIB: Dir = include_dir!("src/std"); + +pub fn resolve_std>(path: T) -> Option { + let path = path.into(); + let path = if path == "std" { "main".to_string() } else { path }; + + if let Some(module) = STDLIB.get_file(path + ".ab") { + let module = module.contents_utf8().unwrap().to_string(); + Some(module) + } else { + None + } +} From 4ebd8a3f0385249dae7e9e1d00e8a1cac2612f81 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 12:25:05 +0200 Subject: [PATCH 02/26] feat(test): updated --- src/std/action.ab | 18 ++ src/std/array.ab | 23 ++ src/std/fs.ab | 58 ++++ src/std/main.ab | 268 ------------------ src/std/math.ab | 5 + src/std/misc.ab | 18 ++ src/std/shell.ab | 56 ++++ src/std/text.ab | 85 ++++++ src/tests/stdlib/array_first_index.ab | 2 +- src/tests/stdlib/array_search.ab | 2 +- src/tests/stdlib/change_owner.ab | 2 +- src/tests/stdlib/chars.ab | 2 +- src/tests/stdlib/create_dir.ab | 2 +- src/tests/stdlib/create_symbolic_link.ab | 2 +- src/tests/stdlib/dir_exist.ab | 2 +- src/tests/stdlib/file_append.ab | 2 +- src/tests/stdlib/file_exist.ab | 2 +- src/tests/stdlib/file_read.ab | 2 +- src/tests/stdlib/file_write.ab | 2 +- src/tests/stdlib/get_env_var.ab | 2 +- src/tests/stdlib/has_failed.ab | 2 +- src/tests/stdlib/in_array.ab | 2 +- src/tests/stdlib/includes_empty_num_array.ab | 2 +- src/tests/stdlib/includes_empty_text_array.ab | 2 +- src/tests/stdlib/includes_exact_match.ab | 2 +- ...des_partial_match_with_expanded_element.ab | 2 +- src/tests/stdlib/includes_text_array.ab | 2 +- src/tests/stdlib/is_command.ab | 2 +- src/tests/stdlib/is_root.ab | 2 +- src/tests/stdlib/join.ab | 2 +- src/tests/stdlib/len_list.ab | 2 +- src/tests/stdlib/len_string.ab | 2 +- src/tests/stdlib/lines.ab | 2 +- src/tests/stdlib/load_env_file.ab | 2 +- src/tests/stdlib/lower.ab | 2 +- src/tests/stdlib/make_executable.ab | 2 +- src/tests/stdlib/parse.ab | 2 +- src/tests/stdlib/replace.ab | 2 +- src/tests/stdlib/replace_once.ab | 2 +- src/tests/stdlib/replace_regex.ab | 2 +- src/tests/stdlib/shell_constant_get.ab | 2 +- src/tests/stdlib/shell_constant_set.ab | 2 +- src/tests/stdlib/shell_isset.ab | 2 +- src/tests/stdlib/shell_unset.ab | 2 +- src/tests/stdlib/shell_var_get.ab | 4 +- src/tests/stdlib/shell_var_set.ab | 2 +- src/tests/stdlib/split.ab | 2 +- src/tests/stdlib/split_multiline.ab | 2 +- src/tests/stdlib/sum.ab | 2 +- src/tests/stdlib/trim.ab | 2 +- src/tests/stdlib/trim_left.ab | 2 +- src/tests/stdlib/trim_right.ab | 2 +- src/tests/stdlib/upper.ab | 2 +- 53 files changed, 309 insertions(+), 314 deletions(-) create mode 100644 src/std/action.ab create mode 100644 src/std/array.ab create mode 100644 src/std/fs.ab delete mode 100644 src/std/main.ab create mode 100644 src/std/math.ab create mode 100644 src/std/misc.ab create mode 100644 src/std/shell.ab create mode 100644 src/std/text.ab diff --git a/src/std/action.ab b/src/std/action.ab new file mode 100644 index 00000000..504ccdbc --- /dev/null +++ b/src/std/action.ab @@ -0,0 +1,18 @@ +pub fun download(url: Text, path: Text): Bool { + if { + is_command("curl") { + unsafe $curl -L -o "{path}" "{url}"$ + } + is_command("wget") { + unsafe $wget "{url}" -P "{path}"$ + } + is_command("aria2c") { + unsafe $aria2c "{url}" -d "{path}"$ + } + else { + return false + } + } + + return true +} diff --git a/src/std/array.ab b/src/std/array.ab new file mode 100644 index 00000000..32ae7f7e --- /dev/null +++ b/src/std/array.ab @@ -0,0 +1,23 @@ +pub fun array_first_index(array, value): Num { + loop index, element in array { + if(value as Text == element as Text) { + return index + } + } + return -1 +} + +pub fun array_search(array, value): [Num] { + let result = [Num] + loop index, element in array { + if(value as Text == element as Text) { + result += [index] + } + } + return result +} + +pub fun in_array(array, value): Bool { + let result = array_first_index(array, value) + return result >= 0 +} diff --git a/src/std/fs.ab b/src/std/fs.ab new file mode 100644 index 00000000..88e43d81 --- /dev/null +++ b/src/std/fs.ab @@ -0,0 +1,58 @@ +pub fun dir_exist(path) { + $[ -d "{path}" ]$ failed { + return false + } + return true +} + +pub fun file_exist(path) { + $[ -f "{path}" ]$ failed { + return false + } + return true +} + +pub fun file_read(path) { + return $< "{path}"$? +} + +pub fun file_write(path, content) { + return $echo "{content}" > "{path}"$? +} + +pub fun file_append(path, content) { + return $echo "{content}" >> "{path}"$? +}pub fun create_symbolic_link(origin: Text, destination: Text): Bool { + if file_exist(origin) { + unsafe $ln -s "{origin}" "{destination}"$ + return true + } + + echo "The file {origin} doesn't exist!" + return false +} + +pub fun create_dir(path: Text): Null { + if not dir_exist(path) { + unsafe $mkdir -p "{path}"$ + } +} + +pub fun make_executable(path: Text): Bool { + if file_exist(path) { + unsafe $chmod +x "{path}"$ + return true + } + + echo "The file {path} doesn't exist!" + return false +} + +pub fun change_owner(user: Text, path: Text): Bool { + if file_exist(path) or dir_exist(path) { + unsafe $chown -R "{user}" "{path}"$ + return true + } + + return false +} diff --git a/src/std/main.ab b/src/std/main.ab deleted file mode 100644 index 77e72297..00000000 --- a/src/std/main.ab +++ /dev/null @@ -1,268 +0,0 @@ -pub fun input(prompt: Text): Text { - unsafe $printf "\${nameof prompt}"$ - unsafe $read$ - return unsafe $echo \$REPLY$ -} - -pub fun replace_once(source, pattern, replacement) { - return unsafe $echo "\$\{source/{pattern}/{replacement}}"$ -} - -pub fun replace(source, pattern, replacement) { - return unsafe $echo "\$\{source//{pattern}/{replacement}}"$ -} - -pub fun replace_regex(source: Text, pattern: Text, replacement: Text): Text { - return unsafe $echo "{source}" | sed -e "s/{pattern}/{replacement}/g"$ -} - -pub fun dir_exist(path) { - $[ -d "{path}" ]$ failed { - return false - } - return true -} - -pub fun file_exist(path) { - $[ -f "{path}" ]$ failed { - return false - } - return true -} - -pub fun file_read(path) { - return $< "{path}"$? -} - -pub fun file_write(path, content) { - return $echo "{content}" > "{path}"$? -} - -pub fun file_append(path, content) { - return $echo "{content}" >> "{path}"$? -} - -pub fun split(text: Text, delimiter: Text): [Text] { - let result = [Text] - unsafe $IFS="{delimiter}" read -rd '' -a {nameof result} < <(printf %s "\${nameof text}")$ - return result -} - -pub fun lines(text: Text): [Text] { - let result = [Text] - unsafe $IFS=\$'\n' read -rd '' -a {nameof result} <<<"\${nameof text}"$ - return result -} - -pub fun words(text: Text): [Text] { - return split(text, " ") -} - -pub fun join(list: [Text], delimiter: Text): Text { - return unsafe $IFS="{delimiter}" ; echo "\$\{{nameof list}[*]}"$ -} - -pub fun trim_left(text: Text): Text { - return unsafe $echo "{text}" | sed -e 's/^[[:space:]]*//'$ -} - -pub fun trim_right(text: Text): Text { - return unsafe $echo "{text}" | sed -e 's/[[:space:]]*\$//'$ -} - -pub fun trim(text: Text): Text { - return trim_left(trim_right(text)) -} - -pub fun lower(text: Text): Text { - return unsafe $echo "{text}" | tr '[:upper:]' '[:lower:]'$ -} - -pub fun upper(text: Text): Text { - return unsafe $echo "{text}" | tr '[:lower:]' '[:upper:]'$ -} - -#[allow_absurd_cast] -pub fun len(value): Num { - unsafe { - if value is Text: - return $echo "\$\{#{nameof value}}"$ as Num - else: - return $echo "\$\{#{nameof value}[@]}"$ as Num - } -} - -#[allow_absurd_cast] -pub fun parse(text: Text): Num { - $[ -n "{text}" ] && [ "{text}" -eq "{text}" ] 2>/dev/null$? - return text as Num -} - -pub fun chars(text: Text): [Text] { - let chars = [Text] - unsafe $for ((i=0; i<\$\{#{nameof text}}; i++)); do - {nameof chars}+=( "\$\{{nameof text}:\$i:1}" ); - done;$ - return chars -} - -#[allow_absurd_cast] -pub fun sum(list: [Num]): Num { - return unsafe $echo "{list}" | awk '\{s=0; for (i=1; i<=NF; i++) s+=\$i; print s}'$ as Num -} - -pub fun array_first_index(array, value): Num { - loop index, element in array { - if(value as Text == element as Text) { - return index - } - } - return -1 -} - -pub fun array_search(array, value): [Num] { - let result = [Num] - loop index, element in array { - if(value as Text == element as Text) { - result += [index] - } - } - return result -} - -pub fun in_array(array, value): Bool { - let result = array_first_index(array, value) - return result >= 0 -} - -pub fun has_failed(command: Text): Bool { - unsafe silent $eval {command}$ - return status != 0 -} - -pub fun exit(code: Num): Null { - unsafe $exit "{code}"$ -} - -pub fun includes(arr, value) { - loop v in arr { - if v == value { - return true - } - } - return false -} - -pub fun is_command(command: Text): Bool { - $[ -x "\$(command -v {command})" ]$ failed { - return false - } - return true -} - -pub fun create_symbolic_link(origin: Text, destination: Text): Bool { - if file_exist(origin) { - unsafe $ln -s "{origin}" "{destination}"$ - return true - } - - echo "The file {origin} doesn't exist!" - return false -} - -pub fun create_dir(path: Text): Null { - if not dir_exist(path) { - unsafe $mkdir -p "{path}"$ - } -} - -pub fun make_executable(path: Text): Bool { - if file_exist(path) { - unsafe $chmod +x "{path}"$ - return true - } - - echo "The file {path} doesn't exist!" - return false -} - -pub fun change_owner(user: Text, path: Text): Bool { - if file_exist(path) or dir_exist(path) { - unsafe $chown -R "{user}" "{path}"$ - return true - } - - return false -} - -pub fun download(url: Text, path: Text): Bool { - if { - is_command("curl") { - unsafe $curl -L -o "{path}" "{url}"$ - } - is_command("wget") { - unsafe $wget "{url}" -P "{path}"$ - } - is_command("aria2c") { - unsafe $aria2c "{url}" -d "{path}"$ - } - else { - return false - } - } - - return true -} - -pub fun is_root(): Bool { - if (unsafe $id -u$ == "0") { - return true - } - - return false -} - -pub fun get_env_var(var: Text): Text { - let _var = unsafe $echo "\$\{!var}"$ - if _var != "" { - return _var - } - - if file_exist(".env") { - unsafe $source ".env"$ - return unsafe $echo "\$\{!var}"$ - } - - return "" -} - -pub fun load_env_file(): Null { - unsafe $export "\$(xargs < .env)" > /dev/null$ -} - -pub fun shell_isset(name: Text): Bool { - $[[ ! -z \$\{!{nameof name}+z} ]]$ failed { - return false - } - return true -} - -pub fun shell_constant_set(name: Text, val: Text): Null { - $readonly \${nameof name}="\${nameof val}" 2> /dev/null$? -} - -pub fun shell_constant_get(name: Text): Text { - return $echo \$\{!{nameof name}}$? -} - -pub fun shell_var_set(name: Text, val: Text): Null { - $export \${nameof name}="\${nameof val}" 2> /dev/null$? -} - -pub fun shell_var_get(name: Text): Text { - return $echo \$\{!{nameof name}}$? -} - -pub fun shell_unset(name: Text): Null { - $unset {name}$? -} diff --git a/src/std/math.ab b/src/std/math.ab new file mode 100644 index 00000000..03fa77a5 --- /dev/null +++ b/src/std/math.ab @@ -0,0 +1,5 @@ +#[allow_absurd_cast] +pub fun sum(list: [Num]): Num { + return unsafe $echo "{list}" | awk '\{s=0; for (i=1; i<=NF; i++) s+=\$i; print s}'$ as Num +} + diff --git a/src/std/misc.ab b/src/std/misc.ab new file mode 100644 index 00000000..bee1829e --- /dev/null +++ b/src/std/misc.ab @@ -0,0 +1,18 @@ +pub fun get_env_var(var: Text): Text { + let _var = unsafe $echo "\$\{!var}"$ + if _var != "" { + return _var + } + + if file_exist(".env") { + unsafe $source ".env"$ + return unsafe $echo "\$\{!var}"$ + } + + return "" +} + +pub fun load_env_file(): Null { + unsafe $export "\$(xargs < .env)" > /dev/null$ +} + diff --git a/src/std/shell.ab b/src/std/shell.ab new file mode 100644 index 00000000..883ebea7 --- /dev/null +++ b/src/std/shell.ab @@ -0,0 +1,56 @@ +pub fun shell_isset(name: Text): Bool { + $[[ ! -z \$\{!{nameof name}+z} ]]$ failed { + return false + } + return true +} + +pub fun shell_constant_set(name: Text, val: Text): Null { + $readonly \${nameof name}="\${nameof val}" 2> /dev/null$? +} + +pub fun shell_constant_get(name: Text): Text { + return $echo \$\{!{nameof name}}$? +} + +pub fun shell_var_set(name: Text, val: Text): Null { + $export \${nameof name}="\${nameof val}" 2> /dev/null$? +} + +pub fun shell_var_get(name: Text): Text { + return $echo \$\{!{nameof name}}$? +} + +pub fun shell_unset(name: Text): Null { + $unset {name}$? +} + +pub fun is_command(command: Text): Bool { + $[ -x "\$(command -v {command})" ]$ failed { + return false + } + return true +} + +pub fun input(prompt: Text): Text { + unsafe $printf "\${nameof prompt}"$ + unsafe $read$ + return "$REPLY" +} + +pub fun has_failed(command: Text): Bool { + unsafe silent $eval {command}$ + return status != 0 +} + +pub fun exit(code: Num): Null { + unsafe $exit "{code}"$ +} + +pub fun is_root(): Bool { + if (unsafe $id -u$ == "0") { + return true + } + + return false +} diff --git a/src/std/text.ab b/src/std/text.ab new file mode 100644 index 00000000..815fb7a5 --- /dev/null +++ b/src/std/text.ab @@ -0,0 +1,85 @@ +pub fun replace_once(source, pattern, replacement) { + return unsafe $echo "\$\{source/{pattern}/{replacement}}"$ +} + +pub fun replace(source, pattern, replacement) { + return unsafe $echo "\$\{source//{pattern}/{replacement}}"$ +} + +pub fun replace_regex(source: Text, pattern: Text, replacement: Text): Text { + return unsafe $echo "{source}" | sed -e "s/{pattern}/{replacement}/g"$ +} + + +pub fun split(text: Text, delimiter: Text): [Text] { + let result = [Text] + unsafe $IFS="{delimiter}" read -rd '' -a {nameof result} < <(printf %s "\${nameof text}")$ + return result +} + +pub fun lines(text: Text): [Text] { + let result = [Text] + unsafe $IFS=\$'\n' read -rd '' -a {nameof result} <<<"\${nameof text}"$ + return result +} + +pub fun words(text: Text): [Text] { + return split(text, " ") +} + +pub fun join(list: [Text], delimiter: Text): Text { + return unsafe $IFS="{delimiter}" ; echo "\$\{{nameof list}[*]}"$ +} + +pub fun trim_left(text: Text): Text { + return unsafe $echo "{text}" | sed -e 's/^[[:space:]]*//'$ +} + +pub fun trim_right(text: Text): Text { + return unsafe $echo "{text}" | sed -e 's/[[:space:]]*\$//'$ +} + +pub fun trim(text: Text): Text { + return trim_left(trim_right(text)) +} + +pub fun lower(text: Text): Text { + return unsafe $echo "{text}" | tr '[:upper:]' '[:lower:]'$ +} + +pub fun upper(text: Text): Text { + return unsafe $echo "{text}" | tr '[:lower:]' '[:upper:]'$ +} + +#[allow_absurd_cast] +pub fun parse(text: Text): Num { + $[ -n "{text}" ] && [ "{text}" -eq "{text}" ] 2>/dev/null$? + return text as Num +} + +pub fun chars(text: Text): [Text] { + let chars = [Text] + unsafe $for ((i=0; i<\$\{#{nameof text}}; i++)); do + {nameof chars}+=( "\$\{{nameof text}:\$i:1}" ); + done;$ + return chars +} + +#[allow_absurd_cast] +pub fun len(value): Num { + unsafe { + if value is Text: + return $echo "\$\{#{nameof value}}"$ as Num + else: + return $echo "\$\{#{nameof value}[@]}"$ as Num + } +} + +pub fun includes(arr, value) { + loop v in arr { + if v == value { + return true + } + } + return false +} diff --git a/src/tests/stdlib/array_first_index.ab b/src/tests/stdlib/array_first_index.ab index c499d8f5..9870a67e 100644 --- a/src/tests/stdlib/array_first_index.ab +++ b/src/tests/stdlib/array_first_index.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { echo array_first_index([1, 2, 3, 4], 3) } diff --git a/src/tests/stdlib/array_search.ab b/src/tests/stdlib/array_search.ab index f2c8e10e..8bae17e3 100644 --- a/src/tests/stdlib/array_search.ab +++ b/src/tests/stdlib/array_search.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let result = array_search([1, 2, 3, 4, 3], 3) echo result[0]+result[1] diff --git a/src/tests/stdlib/change_owner.ab b/src/tests/stdlib/change_owner.ab index 64103796..c4c32f76 100644 --- a/src/tests/stdlib/change_owner.ab +++ b/src/tests/stdlib/change_owner.ab @@ -1,4 +1,4 @@ -import { change_owner } from "std" +import { change_owner } from "std/fs" // We use `whoami` to get the running user to assign again the same user as permission main { unsafe $touch /tmp/amber-symbolic$ diff --git a/src/tests/stdlib/chars.ab b/src/tests/stdlib/chars.ab index c4c9aee2..78ca98ae 100644 --- a/src/tests/stdlib/chars.ab +++ b/src/tests/stdlib/chars.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo chars("hello") } diff --git a/src/tests/stdlib/create_dir.ab b/src/tests/stdlib/create_dir.ab index 442a245b..5acaa44e 100644 --- a/src/tests/stdlib/create_dir.ab +++ b/src/tests/stdlib/create_dir.ab @@ -1,4 +1,4 @@ -import { create_dir, dir_exist } from "std" +import { create_dir, dir_exist } from "std/fs" main { create_dir("/tmp/amber-test") if dir_exist("/tmp/amber-test") { diff --git a/src/tests/stdlib/create_symbolic_link.ab b/src/tests/stdlib/create_symbolic_link.ab index dfefd580..f60358f9 100644 --- a/src/tests/stdlib/create_symbolic_link.ab +++ b/src/tests/stdlib/create_symbolic_link.ab @@ -1,4 +1,4 @@ -import { create_symbolic_link } from "std" +import { create_symbolic_link } from "std/fs" main { unsafe $touch /tmp/amber-symbolic$ if create_symbolic_link("/tmp/amber-symbolic", "/tmp/amber-symbolic-link") { diff --git a/src/tests/stdlib/dir_exist.ab b/src/tests/stdlib/dir_exist.ab index b5e957f9..a5dc2b0e 100644 --- a/src/tests/stdlib/dir_exist.ab +++ b/src/tests/stdlib/dir_exist.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/fs" main { let tmpdir = unsafe $mktemp -d /tmp/amber-XXXX$ if dir_exist(tmpdir) { diff --git a/src/tests/stdlib/file_append.ab b/src/tests/stdlib/file_append.ab index 1ec06216..29f87911 100644 --- a/src/tests/stdlib/file_append.ab +++ b/src/tests/stdlib/file_append.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/file_exist.ab b/src/tests/stdlib/file_exist.ab index e062a1f7..0eddf6be 100644 --- a/src/tests/stdlib/file_exist.ab +++ b/src/tests/stdlib/file_exist.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/fs" main { let tmpdir = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {tmpdir}$ diff --git a/src/tests/stdlib/file_read.ab b/src/tests/stdlib/file_read.ab index 7ac24049..23cf181e 100644 --- a/src/tests/stdlib/file_read.ab +++ b/src/tests/stdlib/file_read.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/file_write.ab b/src/tests/stdlib/file_write.ab index 7ac24049..23cf181e 100644 --- a/src/tests/stdlib/file_write.ab +++ b/src/tests/stdlib/file_write.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/get_env_var.ab b/src/tests/stdlib/get_env_var.ab index 04f8ae3d..84605e56 100644 --- a/src/tests/stdlib/get_env_var.ab +++ b/src/tests/stdlib/get_env_var.ab @@ -1,4 +1,4 @@ -import { get_env_var, file_write } from "std" +import { get_env_var, file_write } from "std/misc" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/has_failed.ab b/src/tests/stdlib/has_failed.ab index 31760ed2..ad887137 100644 --- a/src/tests/stdlib/has_failed.ab +++ b/src/tests/stdlib/has_failed.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { if has_failed("ls /nonexistent") { echo "Command failed" diff --git a/src/tests/stdlib/in_array.ab b/src/tests/stdlib/in_array.ab index cdecfe54..b8b86a7e 100644 --- a/src/tests/stdlib/in_array.ab +++ b/src/tests/stdlib/in_array.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let result = in_array([1, 2, 3, 4, 3], 3) echo result diff --git a/src/tests/stdlib/includes_empty_num_array.ab b/src/tests/stdlib/includes_empty_num_array.ab index 6ed16acd..b5830d9e 100644 --- a/src/tests/stdlib/includes_empty_num_array.ab +++ b/src/tests/stdlib/includes_empty_num_array.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = [Num] diff --git a/src/tests/stdlib/includes_empty_text_array.ab b/src/tests/stdlib/includes_empty_text_array.ab index 461ec12c..a98d4315 100644 --- a/src/tests/stdlib/includes_empty_text_array.ab +++ b/src/tests/stdlib/includes_empty_text_array.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = [Text] diff --git a/src/tests/stdlib/includes_exact_match.ab b/src/tests/stdlib/includes_exact_match.ab index 62bd5426..3d681003 100644 --- a/src/tests/stdlib/includes_exact_match.ab +++ b/src/tests/stdlib/includes_exact_match.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = ["apple", "banana cherry"] diff --git a/src/tests/stdlib/includes_partial_match_with_expanded_element.ab b/src/tests/stdlib/includes_partial_match_with_expanded_element.ab index 3f67485e..fad03647 100644 --- a/src/tests/stdlib/includes_partial_match_with_expanded_element.ab +++ b/src/tests/stdlib/includes_partial_match_with_expanded_element.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = ["foo", "bar", "baz"] diff --git a/src/tests/stdlib/includes_text_array.ab b/src/tests/stdlib/includes_text_array.ab index f5f8f776..0455a99c 100644 --- a/src/tests/stdlib/includes_text_array.ab +++ b/src/tests/stdlib/includes_text_array.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = ["apple", "banana", "cherry"] diff --git a/src/tests/stdlib/is_command.ab b/src/tests/stdlib/is_command.ab index f68ef7c8..a84ede9c 100644 --- a/src/tests/stdlib/is_command.ab +++ b/src/tests/stdlib/is_command.ab @@ -1,4 +1,4 @@ -import { is_command } from "std" +import { is_command } from "std/shell" main { if is_command("cat") { echo "exist-cat" diff --git a/src/tests/stdlib/is_root.ab b/src/tests/stdlib/is_root.ab index b0196fe7..2fddbc49 100644 --- a/src/tests/stdlib/is_root.ab +++ b/src/tests/stdlib/is_root.ab @@ -1,4 +1,4 @@ -import { is_root } from "std" +import { is_root } from "std/shell" main { if not is_root() { echo "no" diff --git a/src/tests/stdlib/join.ab b/src/tests/stdlib/join.ab index 63844933..a502cc3b 100644 --- a/src/tests/stdlib/join.ab +++ b/src/tests/stdlib/join.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { echo join(["apple", "banana", "cherry"], ", ") } diff --git a/src/tests/stdlib/len_list.ab b/src/tests/stdlib/len_list.ab index a628f47d..8d0b6ed8 100644 --- a/src/tests/stdlib/len_list.ab +++ b/src/tests/stdlib/len_list.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo len([1, 2, 3, 4]) } diff --git a/src/tests/stdlib/len_string.ab b/src/tests/stdlib/len_string.ab index f4ba2620..5569c928 100644 --- a/src/tests/stdlib/len_string.ab +++ b/src/tests/stdlib/len_string.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo len("hello") } diff --git a/src/tests/stdlib/lines.ab b/src/tests/stdlib/lines.ab index 9a581899..0e07cfaf 100644 --- a/src/tests/stdlib/lines.ab +++ b/src/tests/stdlib/lines.ab @@ -1,4 +1,4 @@ -import { lines } from "std" +import { lines } from "std/text" main { loop line in lines("hello\nworld") { echo "line: " + line diff --git a/src/tests/stdlib/load_env_file.ab b/src/tests/stdlib/load_env_file.ab index dc8ea90a..239ac5a7 100644 --- a/src/tests/stdlib/load_env_file.ab +++ b/src/tests/stdlib/load_env_file.ab @@ -1,4 +1,4 @@ -import { load_env_file, get_env_var, file_write } from "std" +import { load_env_file, get_env_var, file_write } from "std/misc" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/lower.ab b/src/tests/stdlib/lower.ab index 0fa92981..d061a833 100644 --- a/src/tests/stdlib/lower.ab +++ b/src/tests/stdlib/lower.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo lower("HELLO WORLD") } diff --git a/src/tests/stdlib/make_executable.ab b/src/tests/stdlib/make_executable.ab index 6fa6ef74..8dee463f 100644 --- a/src/tests/stdlib/make_executable.ab +++ b/src/tests/stdlib/make_executable.ab @@ -1,4 +1,4 @@ -import { make_executable } from "std" +import { make_executable } from "std/fs" main { unsafe $touch /tmp/amber-symbolic$ if make_executable("/tmp/amber-symbolic") { diff --git a/src/tests/stdlib/parse.ab b/src/tests/stdlib/parse.ab index a546ce96..86029642 100644 --- a/src/tests/stdlib/parse.ab +++ b/src/tests/stdlib/parse.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo parse("123")? } diff --git a/src/tests/stdlib/replace.ab b/src/tests/stdlib/replace.ab index b493e7a3..2d4073f4 100644 --- a/src/tests/stdlib/replace.ab +++ b/src/tests/stdlib/replace.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo replace("banana banana", "banana", "apple") } diff --git a/src/tests/stdlib/replace_once.ab b/src/tests/stdlib/replace_once.ab index d7b41558..81554079 100644 --- a/src/tests/stdlib/replace_once.ab +++ b/src/tests/stdlib/replace_once.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo replace_once("hello world!", "world", "Amber") } diff --git a/src/tests/stdlib/replace_regex.ab b/src/tests/stdlib/replace_regex.ab index 6577c20e..7e1dcbf5 100644 --- a/src/tests/stdlib/replace_regex.ab +++ b/src/tests/stdlib/replace_regex.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo replace_regex("abc123def", "[0-9][0-9]*", "456") } diff --git a/src/tests/stdlib/shell_constant_get.ab b/src/tests/stdlib/shell_constant_get.ab index 050d927e..3cf7f35d 100644 --- a/src/tests/stdlib/shell_constant_get.ab +++ b/src/tests/stdlib/shell_constant_get.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { unsafe shell_constant_set("test_shell_constant_get", "Hello Amber!") unsafe $echo "\$test_shell_constant_get"$ diff --git a/src/tests/stdlib/shell_constant_set.ab b/src/tests/stdlib/shell_constant_set.ab index 18b5c24e..1aea1866 100644 --- a/src/tests/stdlib/shell_constant_set.ab +++ b/src/tests/stdlib/shell_constant_set.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { unsafe shell_constant_set("test_shell_constant_set", "Hello Amber") let str = "" diff --git a/src/tests/stdlib/shell_isset.ab b/src/tests/stdlib/shell_isset.ab index d0aaceed..60e1a0ca 100644 --- a/src/tests/stdlib/shell_isset.ab +++ b/src/tests/stdlib/shell_isset.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { unsafe $test_var_isset="test"$ if shell_isset("test_var_isset") { diff --git a/src/tests/stdlib/shell_unset.ab b/src/tests/stdlib/shell_unset.ab index 46af16c6..47a8fd42 100644 --- a/src/tests/stdlib/shell_unset.ab +++ b/src/tests/stdlib/shell_unset.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { unsafe shell_var_set("test_shell_unset", "Hello Amber!") unsafe $echo \$test_shell_unset$ diff --git a/src/tests/stdlib/shell_var_get.ab b/src/tests/stdlib/shell_var_get.ab index 26ce0745..ba3972f0 100644 --- a/src/tests/stdlib/shell_var_get.ab +++ b/src/tests/stdlib/shell_var_get.ab @@ -1,5 +1,5 @@ -import * from "std" +import * from "std/shell" main { unsafe $export test_shell_var_get="Hello Amber!"$ echo unsafe shell_var_get("test_shell_var_get") -} \ No newline at end of file +} diff --git a/src/tests/stdlib/shell_var_set.ab b/src/tests/stdlib/shell_var_set.ab index 366531e9..5fdb85f4 100644 --- a/src/tests/stdlib/shell_var_set.ab +++ b/src/tests/stdlib/shell_var_set.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { unsafe shell_var_set("test_shell_var_set", "Hello Amber!") unsafe $echo \$test_shell_var_set$ diff --git a/src/tests/stdlib/split.ab b/src/tests/stdlib/split.ab index ee0fd73b..dd2b2e12 100644 --- a/src/tests/stdlib/split.ab +++ b/src/tests/stdlib/split.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/split" main { let array = split("apple,banana,cherry", ",") echo array[1] diff --git a/src/tests/stdlib/split_multiline.ab b/src/tests/stdlib/split_multiline.ab index 65bd1dc7..24379ce6 100644 --- a/src/tests/stdlib/split_multiline.ab +++ b/src/tests/stdlib/split_multiline.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { let array = split("apple,ban\nana,cherry", ",") echo array diff --git a/src/tests/stdlib/sum.ab b/src/tests/stdlib/sum.ab index fc05a891..013854a0 100644 --- a/src/tests/stdlib/sum.ab +++ b/src/tests/stdlib/sum.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/math" main { echo sum([1, 2, 3, 4]) } diff --git a/src/tests/stdlib/trim.ab b/src/tests/stdlib/trim.ab index b15188eb..63abcfa2 100644 --- a/src/tests/stdlib/trim.ab +++ b/src/tests/stdlib/trim.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo trim(" hello world ") } diff --git a/src/tests/stdlib/trim_left.ab b/src/tests/stdlib/trim_left.ab index 28afcf55..4a038a95 100644 --- a/src/tests/stdlib/trim_left.ab +++ b/src/tests/stdlib/trim_left.ab @@ -1,4 +1,4 @@ - import * from "std" + import * from "std/text" main { echo trim_left(" hello world ") } diff --git a/src/tests/stdlib/trim_right.ab b/src/tests/stdlib/trim_right.ab index 49540e06..a202ce17 100644 --- a/src/tests/stdlib/trim_right.ab +++ b/src/tests/stdlib/trim_right.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo trim_right(" hello world ") } diff --git a/src/tests/stdlib/upper.ab b/src/tests/stdlib/upper.ab index deef4955..9021b261 100644 --- a/src/tests/stdlib/upper.ab +++ b/src/tests/stdlib/upper.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/text" main { echo upper("hello world") } From dd4504d76908cb769b18404e0c705cffb4781f39 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 12:38:31 +0200 Subject: [PATCH 03/26] fix(cargo): missing crate --- Cargo.toml | 1 + setup/install.ab | 3 ++- src/main.rs | 1 + src/modules/imports/import.rs | 2 +- src/stdlib.rs | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2481557b..5255263e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ clap = { version = "4.4.18", features = ["derive"] } tempfile = "3.10.1" chrono = "0.4.38" test-generator = "0.3.1" +include_dir = "0.7.4" # test dependencies [dev-dependencies] diff --git a/setup/install.ab b/setup/install.ab index 9fb47b04..171abecc 100644 --- a/setup/install.ab +++ b/setup/install.ab @@ -1,4 +1,5 @@ -import { has_failed, includes, exit, chars } from "std" +import { has_failed, exit } from "std/shell" +import { chars, includes } from "std/text" import { get_os, get_arch, get_place, get_bins_folder } from "./shared.ab" let name = "AmberNative" diff --git a/src/main.rs b/src/main.rs index 88f27314..62bdfa4c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod modules; mod rules; mod translate; mod utils; +mod stdlib; #[cfg(test)] pub mod tests; diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index e1b1aeda..f77ceb77 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -71,7 +71,7 @@ impl Import { fn resolve_import(&mut self, meta: &ParserMetadata) -> Result { if self.path.value.starts_with("std") { - match stdlib::resolve_std(&self.path.value) { + match stdlib::resolve(&self.path.value) { Some(v) => Ok(v), None => error!(meta, self.token_path.clone() => { message: format!("Std module does not exist: {}", self.path.value), diff --git a/src/stdlib.rs b/src/stdlib.rs index a378a8e1..be4d654d 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -1,7 +1,7 @@ use include_dir::{include_dir, Dir}; pub const STDLIB: Dir = include_dir!("src/std"); -pub fn resolve_std>(path: T) -> Option { +pub fn resolve>(path: T) -> Option { let path = path.into(); let path = if path == "std" { "main".to_string() } else { path }; From 289d02d9e2d51e762f63ecaf3ee41d6c365cb0c8 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 12:41:27 +0200 Subject: [PATCH 04/26] fix(cargo): missing crate --- Cargo.lock | 20 ++++++++++++++++++++ src/stdlib.rs | 1 - src/tests/stdlib/no_output/download.ab | 4 ++-- src/tests/stdlib/no_output/exit.ab | 2 +- src/tests/stdlib/no_output/input.ab | 2 +- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22d44e02..b4676976 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,7 @@ dependencies = [ "clap", "colored", "heraclitus-compiler", + "include_dir", "itertools", "predicates", "similar-string", @@ -337,6 +338,25 @@ dependencies = [ "cc", ] +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.36", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.0" diff --git a/src/stdlib.rs b/src/stdlib.rs index be4d654d..709f9d61 100644 --- a/src/stdlib.rs +++ b/src/stdlib.rs @@ -3,7 +3,6 @@ pub const STDLIB: Dir = include_dir!("src/std"); pub fn resolve>(path: T) -> Option { let path = path.into(); - let path = if path == "std" { "main".to_string() } else { path }; if let Some(module) = STDLIB.get_file(path + ".ab") { let module = module.contents_utf8().unwrap().to_string(); diff --git a/src/tests/stdlib/no_output/download.ab b/src/tests/stdlib/no_output/download.ab index a1b24634..c10cdfe4 100644 --- a/src/tests/stdlib/no_output/download.ab +++ b/src/tests/stdlib/no_output/download.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/action" main { let tmpdir = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {tmpdir}$ @@ -8,4 +8,4 @@ main { } } unsafe $rm -fr {tmpdir}$ -} \ No newline at end of file +} diff --git a/src/tests/stdlib/no_output/exit.ab b/src/tests/stdlib/no_output/exit.ab index 45db9d4d..a04f7d3a 100644 --- a/src/tests/stdlib/no_output/exit.ab +++ b/src/tests/stdlib/no_output/exit.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { exit(37) } diff --git a/src/tests/stdlib/no_output/input.ab b/src/tests/stdlib/no_output/input.ab index 640b0c2f..430931b3 100644 --- a/src/tests/stdlib/no_output/input.ab +++ b/src/tests/stdlib/no_output/input.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/shell" main { let name = input("Please enter your name:") echo "Hello, " + name From 4957174484318145324041a91b6c1cc5f9312d12 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 14:59:31 +0200 Subject: [PATCH 05/26] fix(resolve): remove std to search it --- src/modules/imports/import.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index f77ceb77..392c5954 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -71,7 +71,7 @@ impl Import { fn resolve_import(&mut self, meta: &ParserMetadata) -> Result { if self.path.value.starts_with("std") { - match stdlib::resolve(&self.path.value) { + match stdlib::resolve(&self.path.value.replace("std/", "")) { Some(v) => Ok(v), None => error!(meta, self.token_path.clone() => { message: format!("Std module does not exist: {}", self.path.value), From 5219074e55c519780bebb3f094fe1699ff8ee57f Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 15:09:13 +0200 Subject: [PATCH 06/26] fix(test): done --- src/std/action.ab | 2 ++ src/std/array.ab | 9 +++++++++ src/std/misc.ab | 2 ++ src/std/text.ab | 9 --------- src/tests/stdlib/get_env_var.ab | 3 ++- src/tests/stdlib/includes_prefix_match.ab | 2 +- src/tests/stdlib/join.ab | 2 +- src/tests/stdlib/load_env_file.ab | 3 ++- src/tests/stdlib/no_output/download.ab | 1 + src/tests/stdlib/split.ab | 2 +- src/tests/validity.rs | 2 +- 11 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/std/action.ab b/src/std/action.ab index 504ccdbc..efb9c324 100644 --- a/src/std/action.ab +++ b/src/std/action.ab @@ -1,3 +1,5 @@ +import * from "std/shell" + pub fun download(url: Text, path: Text): Bool { if { is_command("curl") { diff --git a/src/std/array.ab b/src/std/array.ab index 32ae7f7e..0ecbaa2b 100644 --- a/src/std/array.ab +++ b/src/std/array.ab @@ -21,3 +21,12 @@ pub fun in_array(array, value): Bool { let result = array_first_index(array, value) return result >= 0 } + +pub fun includes(arr, value) { + loop v in arr { + if v == value { + return true + } + } + return false +} diff --git a/src/std/misc.ab b/src/std/misc.ab index bee1829e..5a420db2 100644 --- a/src/std/misc.ab +++ b/src/std/misc.ab @@ -1,3 +1,5 @@ +import * from "std/fs" + pub fun get_env_var(var: Text): Text { let _var = unsafe $echo "\$\{!var}"$ if _var != "" { diff --git a/src/std/text.ab b/src/std/text.ab index 815fb7a5..bcd5bdc5 100644 --- a/src/std/text.ab +++ b/src/std/text.ab @@ -74,12 +74,3 @@ pub fun len(value): Num { return $echo "\$\{#{nameof value}[@]}"$ as Num } } - -pub fun includes(arr, value) { - loop v in arr { - if v == value { - return true - } - } - return false -} diff --git a/src/tests/stdlib/get_env_var.ab b/src/tests/stdlib/get_env_var.ab index 84605e56..09c34e3c 100644 --- a/src/tests/stdlib/get_env_var.ab +++ b/src/tests/stdlib/get_env_var.ab @@ -1,4 +1,5 @@ -import { get_env_var, file_write } from "std/misc" +import { get_env_var } from "std/misc" +import { file_write } from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/includes_prefix_match.ab b/src/tests/stdlib/includes_prefix_match.ab index 4bfcc5c4..e9158bbb 100644 --- a/src/tests/stdlib/includes_prefix_match.ab +++ b/src/tests/stdlib/includes_prefix_match.ab @@ -1,4 +1,4 @@ -import * from "std" +import * from "std/array" main { let array = ["apple", "banana cherry"] diff --git a/src/tests/stdlib/join.ab b/src/tests/stdlib/join.ab index a502cc3b..bab1340d 100644 --- a/src/tests/stdlib/join.ab +++ b/src/tests/stdlib/join.ab @@ -1,4 +1,4 @@ -import * from "std/array" +import * from "std/text" main { echo join(["apple", "banana", "cherry"], ", ") } diff --git a/src/tests/stdlib/load_env_file.ab b/src/tests/stdlib/load_env_file.ab index 239ac5a7..0a4a33a5 100644 --- a/src/tests/stdlib/load_env_file.ab +++ b/src/tests/stdlib/load_env_file.ab @@ -1,4 +1,5 @@ -import { load_env_file, get_env_var, file_write } from "std/misc" +import { load_env_file, get_env_var } from "std/misc" +import { file_write } from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {path}$ diff --git a/src/tests/stdlib/no_output/download.ab b/src/tests/stdlib/no_output/download.ab index c10cdfe4..bd5843be 100644 --- a/src/tests/stdlib/no_output/download.ab +++ b/src/tests/stdlib/no_output/download.ab @@ -1,4 +1,5 @@ import * from "std/action" +import * from "std/fs" main { let tmpdir = unsafe $mktemp -d /tmp/amber-XXXX$ unsafe $cd {tmpdir}$ diff --git a/src/tests/stdlib/split.ab b/src/tests/stdlib/split.ab index dd2b2e12..3574ba36 100644 --- a/src/tests/stdlib/split.ab +++ b/src/tests/stdlib/split.ab @@ -1,4 +1,4 @@ -import * from "std/split" +import * from "std/text" main { let array = split("apple,banana,cherry", ",") echo array[1] diff --git a/src/tests/validity.rs b/src/tests/validity.rs index 9b139d52..9f7625c5 100644 --- a/src/tests/validity.rs +++ b/src/tests/validity.rs @@ -717,7 +717,7 @@ fn null() { #[test] fn failed() { let code = " - import { sum } from \"std\" + import { sum } from \"std/math\" let requirements = [true, true, true] main { From 9235015a143e68b1b7d8368b6bd32a5270056b19 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 9 Jul 2024 18:16:51 +0200 Subject: [PATCH 07/26] fix(std): renamed action --- src/std/{action.ab => http.ab} | 0 src/tests/stdlib/no_output/download.ab | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/std/{action.ab => http.ab} (100%) diff --git a/src/std/action.ab b/src/std/http.ab similarity index 100% rename from src/std/action.ab rename to src/std/http.ab diff --git a/src/tests/stdlib/no_output/download.ab b/src/tests/stdlib/no_output/download.ab index bd5843be..d2be6072 100644 --- a/src/tests/stdlib/no_output/download.ab +++ b/src/tests/stdlib/no_output/download.ab @@ -1,4 +1,4 @@ -import * from "std/action" +import * from "std/http" import * from "std/fs" main { let tmpdir = unsafe $mktemp -d /tmp/amber-XXXX$ From ad2352f68140c7ae566c8cf2326a3d78c3bfd31e Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:57:41 +0200 Subject: [PATCH 08/26] Update src/modules/imports/import.rs Co-authored-by: Phoenix Himself --- src/modules/imports/import.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index 392c5954..a3656f11 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -70,7 +70,7 @@ impl Import { } fn resolve_import(&mut self, meta: &ParserMetadata) -> Result { - if self.path.value.starts_with("std") { + if self.path.value.starts_with("std/") { match stdlib::resolve(&self.path.value.replace("std/", "")) { Some(v) => Ok(v), None => error!(meta, self.token_path.clone() => { From f61a3fb3e0c68d3c83ce6b748f6195687b0308f3 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:57:56 +0200 Subject: [PATCH 09/26] Update src/modules/imports/import.rs Co-authored-by: Phoenix Himself --- src/modules/imports/import.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index a3656f11..c85fab5a 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -73,10 +73,8 @@ impl Import { if self.path.value.starts_with("std/") { match stdlib::resolve(&self.path.value.replace("std/", "")) { Some(v) => Ok(v), - None => error!(meta, self.token_path.clone() => { - message: format!("Std module does not exist: {}", self.path.value), - comment: String::new() - }) + None => error!(meta, self.token_path.clone(), + format!("Standard library module '{}' does not exist", self.path.value)) } } else { match fs::read_to_string(self.path.value.clone()) { From 9609804943a4941d8012242c340e196eaff10641 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:58:13 +0200 Subject: [PATCH 10/26] Update src/modules/imports/import.rs Co-authored-by: Phoenix Himself --- src/modules/imports/import.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/imports/import.rs b/src/modules/imports/import.rs index c85fab5a..f97fe0e1 100644 --- a/src/modules/imports/import.rs +++ b/src/modules/imports/import.rs @@ -81,7 +81,7 @@ impl Import { Ok(content) => Ok(content), Err(err) => error!(meta, self.token_path.clone() => { message: format!("Could not read file '{}'", self.path.value), - comment: err.to_string() + comment: err.to_string() }) } } From 5e9ee026324299b8344aa11150aa2fe1277ec82e Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:58:40 +0200 Subject: [PATCH 11/26] Update src/modules/imports/import_string.rs Co-authored-by: Phoenix Himself --- src/modules/imports/import_string.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/imports/import_string.rs b/src/modules/imports/import_string.rs index e82e1456..35b9104a 100644 --- a/src/modules/imports/import_string.rs +++ b/src/modules/imports/import_string.rs @@ -9,7 +9,7 @@ pub struct ImportString { impl ImportString { fn resolve_path(&mut self, meta: &ParserMetadata, tok: Option) -> SyntaxResult { - if self.value.starts_with("std") { + if self.value.starts_with("std/") { return Ok(()) } let mut path = meta.context.path.as_ref() From b15a8cbed01ecb09a0ccd74914fe048ab0425261 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:58:52 +0200 Subject: [PATCH 12/26] Update src/std/array.ab Co-authored-by: Phoenix Himself --- src/std/array.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/array.ab b/src/std/array.ab index 0ecbaa2b..e7b5ce6c 100644 --- a/src/std/array.ab +++ b/src/std/array.ab @@ -10,7 +10,7 @@ pub fun array_first_index(array, value): Num { pub fun array_search(array, value): [Num] { let result = [Num] loop index, element in array { - if(value as Text == element as Text) { + if value as Text == element as Text { result += [index] } } From 21f05955d9eedd9cbc3f8e7f1327ff90461cdf2f Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:59:00 +0200 Subject: [PATCH 13/26] Update src/std/array.ab Co-authored-by: Phoenix Himself --- src/std/array.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/array.ab b/src/std/array.ab index e7b5ce6c..30867daf 100644 --- a/src/std/array.ab +++ b/src/std/array.ab @@ -1,6 +1,6 @@ pub fun array_first_index(array, value): Num { loop index, element in array { - if(value as Text == element as Text) { + if value as Text == element as Text { return index } } From 5d3f24ce398d03e69acc87cbe0f7c9e282afaff1 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:59:24 +0200 Subject: [PATCH 14/26] Update src/std/fs.ab Co-authored-by: Phoenix Himself --- src/std/fs.ab | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/std/fs.ab b/src/std/fs.ab index 88e43d81..d9a05fb6 100644 --- a/src/std/fs.ab +++ b/src/std/fs.ab @@ -22,7 +22,9 @@ pub fun file_write(path, content) { pub fun file_append(path, content) { return $echo "{content}" >> "{path}"$? -}pub fun create_symbolic_link(origin: Text, destination: Text): Bool { +} + +pub fun create_symbolic_link(origin: Text, destination: Text): Bool { if file_exist(origin) { unsafe $ln -s "{origin}" "{destination}"$ return true From 0c98d5d911e5ceb2563e47e48f35b6c7d5a7b919 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 10:59:34 +0200 Subject: [PATCH 15/26] Update src/std/shell.ab Co-authored-by: Phoenix Himself --- src/std/shell.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/shell.ab b/src/std/shell.ab index 883ebea7..6a65a991 100644 --- a/src/std/shell.ab +++ b/src/std/shell.ab @@ -48,7 +48,7 @@ pub fun exit(code: Num): Null { } pub fun is_root(): Bool { - if (unsafe $id -u$ == "0") { + if unsafe $id -u$ == "0" { return true } From 91c0762e361ce738c82f799306c5811412d50745 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 11:06:09 +0200 Subject: [PATCH 16/26] feat(review): moved shell to env --- src/std/{shell.ab => env.ab} | 20 ++++++++++++++++++++ src/std/misc.ab | 20 -------------------- src/tests/stdlib/get_env_var.ab | 2 +- src/tests/stdlib/load_env_file.ab | 2 +- src/tests/stdlib/shell_constant_get.ab | 2 +- src/tests/stdlib/shell_constant_set.ab | 2 +- src/tests/stdlib/shell_isset.ab | 2 +- src/tests/stdlib/shell_unset.ab | 2 +- src/tests/stdlib/shell_var_get.ab | 2 +- src/tests/stdlib/shell_var_set.ab | 2 +- 10 files changed, 28 insertions(+), 28 deletions(-) rename src/std/{shell.ab => env.ab} (75%) delete mode 100644 src/std/misc.ab diff --git a/src/std/shell.ab b/src/std/env.ab similarity index 75% rename from src/std/shell.ab rename to src/std/env.ab index 6a65a991..f4f081bf 100644 --- a/src/std/shell.ab +++ b/src/std/env.ab @@ -1,3 +1,23 @@ +import * from "std/fs" + +pub fun get_env_var(var: Text): Text { + let _var = unsafe $echo "\$\{!var}"$ + if _var != "" { + return _var + } + + if file_exist(".env") { + unsafe $source ".env"$ + return unsafe $echo "\$\{!var}"$ + } + + return "" +} + +pub fun load_env_file(): Null { + unsafe $export "\$(xargs < .env)" > /dev/null$ +} + pub fun shell_isset(name: Text): Bool { $[[ ! -z \$\{!{nameof name}+z} ]]$ failed { return false diff --git a/src/std/misc.ab b/src/std/misc.ab deleted file mode 100644 index 5a420db2..00000000 --- a/src/std/misc.ab +++ /dev/null @@ -1,20 +0,0 @@ -import * from "std/fs" - -pub fun get_env_var(var: Text): Text { - let _var = unsafe $echo "\$\{!var}"$ - if _var != "" { - return _var - } - - if file_exist(".env") { - unsafe $source ".env"$ - return unsafe $echo "\$\{!var}"$ - } - - return "" -} - -pub fun load_env_file(): Null { - unsafe $export "\$(xargs < .env)" > /dev/null$ -} - diff --git a/src/tests/stdlib/get_env_var.ab b/src/tests/stdlib/get_env_var.ab index 09c34e3c..31a6ddb2 100644 --- a/src/tests/stdlib/get_env_var.ab +++ b/src/tests/stdlib/get_env_var.ab @@ -1,4 +1,4 @@ -import { get_env_var } from "std/misc" +import { get_env_var } from "std/env" import { file_write } from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ diff --git a/src/tests/stdlib/load_env_file.ab b/src/tests/stdlib/load_env_file.ab index 0a4a33a5..fb636d5c 100644 --- a/src/tests/stdlib/load_env_file.ab +++ b/src/tests/stdlib/load_env_file.ab @@ -1,4 +1,4 @@ -import { load_env_file, get_env_var } from "std/misc" +import { load_env_file, get_env_var } from "std/env" import { file_write } from "std/fs" main { let path = unsafe $mktemp -d /tmp/amber-XXXX$ diff --git a/src/tests/stdlib/shell_constant_get.ab b/src/tests/stdlib/shell_constant_get.ab index 3cf7f35d..ba9628ea 100644 --- a/src/tests/stdlib/shell_constant_get.ab +++ b/src/tests/stdlib/shell_constant_get.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe shell_constant_set("test_shell_constant_get", "Hello Amber!") unsafe $echo "\$test_shell_constant_get"$ diff --git a/src/tests/stdlib/shell_constant_set.ab b/src/tests/stdlib/shell_constant_set.ab index 1aea1866..f1a140a8 100644 --- a/src/tests/stdlib/shell_constant_set.ab +++ b/src/tests/stdlib/shell_constant_set.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe shell_constant_set("test_shell_constant_set", "Hello Amber") let str = "" diff --git a/src/tests/stdlib/shell_isset.ab b/src/tests/stdlib/shell_isset.ab index 60e1a0ca..4adf76d2 100644 --- a/src/tests/stdlib/shell_isset.ab +++ b/src/tests/stdlib/shell_isset.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe $test_var_isset="test"$ if shell_isset("test_var_isset") { diff --git a/src/tests/stdlib/shell_unset.ab b/src/tests/stdlib/shell_unset.ab index 47a8fd42..cfd4cb76 100644 --- a/src/tests/stdlib/shell_unset.ab +++ b/src/tests/stdlib/shell_unset.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe shell_var_set("test_shell_unset", "Hello Amber!") unsafe $echo \$test_shell_unset$ diff --git a/src/tests/stdlib/shell_var_get.ab b/src/tests/stdlib/shell_var_get.ab index ba3972f0..e9e96e07 100644 --- a/src/tests/stdlib/shell_var_get.ab +++ b/src/tests/stdlib/shell_var_get.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe $export test_shell_var_get="Hello Amber!"$ echo unsafe shell_var_get("test_shell_var_get") diff --git a/src/tests/stdlib/shell_var_set.ab b/src/tests/stdlib/shell_var_set.ab index 5fdb85f4..255e9fa5 100644 --- a/src/tests/stdlib/shell_var_set.ab +++ b/src/tests/stdlib/shell_var_set.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { unsafe shell_var_set("test_shell_var_set", "Hello Amber!") unsafe $echo \$test_shell_var_set$ From 383e414403e514bbd57bdb742f8cb39a75e3c882 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 11:10:34 +0200 Subject: [PATCH 17/26] feat(review): moved shell to env --- src/tests/stdlib/has_failed.ab | 2 +- src/tests/stdlib/is_command.ab | 2 +- src/tests/stdlib/is_root.ab | 2 +- src/tests/stdlib/no_output/exit.ab | 2 +- src/tests/stdlib/no_output/input.ab | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/stdlib/has_failed.ab b/src/tests/stdlib/has_failed.ab index ad887137..387a1632 100644 --- a/src/tests/stdlib/has_failed.ab +++ b/src/tests/stdlib/has_failed.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { if has_failed("ls /nonexistent") { echo "Command failed" diff --git a/src/tests/stdlib/is_command.ab b/src/tests/stdlib/is_command.ab index a84ede9c..125ab7da 100644 --- a/src/tests/stdlib/is_command.ab +++ b/src/tests/stdlib/is_command.ab @@ -1,4 +1,4 @@ -import { is_command } from "std/shell" +import { is_command } from "std/env" main { if is_command("cat") { echo "exist-cat" diff --git a/src/tests/stdlib/is_root.ab b/src/tests/stdlib/is_root.ab index 2fddbc49..50b2ea75 100644 --- a/src/tests/stdlib/is_root.ab +++ b/src/tests/stdlib/is_root.ab @@ -1,4 +1,4 @@ -import { is_root } from "std/shell" +import { is_root } from "std/env" main { if not is_root() { echo "no" diff --git a/src/tests/stdlib/no_output/exit.ab b/src/tests/stdlib/no_output/exit.ab index a04f7d3a..44df745f 100644 --- a/src/tests/stdlib/no_output/exit.ab +++ b/src/tests/stdlib/no_output/exit.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { exit(37) } diff --git a/src/tests/stdlib/no_output/input.ab b/src/tests/stdlib/no_output/input.ab index 430931b3..f4dc253a 100644 --- a/src/tests/stdlib/no_output/input.ab +++ b/src/tests/stdlib/no_output/input.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" main { let name = input("Please enter your name:") echo "Hello, " + name From 0bd5ffdbbc34e26740a11dfb37f0c6e8339564c4 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 10 Jul 2024 11:15:01 +0200 Subject: [PATCH 18/26] feat(review): moved shell to env --- src/std/http.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/http.ab b/src/std/http.ab index efb9c324..8a14a731 100644 --- a/src/std/http.ab +++ b/src/std/http.ab @@ -1,4 +1,4 @@ -import * from "std/shell" +import * from "std/env" pub fun download(url: Text, path: Text): Bool { if { From 7a109c1ef7d45aad137dca90d199c05e0bbdaf7d Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Fri, 12 Jul 2024 19:31:19 +0200 Subject: [PATCH 19/26] Update setup/install.ab Co-authored-by: Phoenix Himself --- setup/install.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/install.ab b/setup/install.ab index 171abecc..76423dd8 100644 --- a/setup/install.ab +++ b/setup/install.ab @@ -1,4 +1,4 @@ -import { has_failed, exit } from "std/shell" +import { has_failed, exit } from "std/env" import { chars, includes } from "std/text" import { get_os, get_arch, get_place, get_bins_folder } from "./shared.ab" From 2f443570475b223320a2d049f0852061901ad19d Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Mon, 15 Jul 2024 10:47:14 +0200 Subject: [PATCH 20/26] fix(install): done --- setup/install.ab | 6 ++++-- setup/shared.ab | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/setup/install.ab b/setup/install.ab index 76423dd8..4f5f14d2 100644 --- a/setup/install.ab +++ b/setup/install.ab @@ -1,5 +1,7 @@ import { has_failed, exit } from "std/env" -import { chars, includes } from "std/text" +import { chars } from "std/text" +import { includes } from "std/array" +import { file_exist } from "std/fs" import { get_os, get_arch, get_place, get_bins_folder } from "./shared.ab" let name = "AmberNative" @@ -115,7 +117,7 @@ main(args) { // Delete the previous symbolic link if file_exist("{bins_folder}/{target}") { - ${sudo} rm "{bins_folder}/{target}" failed { + ${sudo} rm "{bins_folder}/{target}"$ failed { echo "Failed to remove the previous amber symbol link." echo "Please make sure that root user can access {bins_folder} directory." exit(1) diff --git a/setup/shared.ab b/setup/shared.ab index cf1c4022..135301cb 100644 --- a/setup/shared.ab +++ b/setup/shared.ab @@ -1,4 +1,5 @@ -import { exit, includes, has_failed } from "std" +import { has_failed, exit } from "std/env" +import { includes } from "std/array" pub fun get_os(): Text { // Determine OS type From 696d92a681c95aa738fe23017b798442d5582bef Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 10:55:59 +0200 Subject: [PATCH 21/26] fix(test): input version by @cymdeveloppement --- src/tests/stdlib.rs | 32 ----------------------- src/tests/stdlib/{no_output => }/input.ab | 2 ++ src/tests/stdlib/input.output.txt | 1 + 3 files changed, 3 insertions(+), 32 deletions(-) rename src/tests/stdlib/{no_output => }/input.ab (56%) create mode 100644 src/tests/stdlib/input.output.txt diff --git a/src/tests/stdlib.rs b/src/tests/stdlib.rs index 2daf7fa5..c36e4270 100644 --- a/src/tests/stdlib.rs +++ b/src/tests/stdlib.rs @@ -5,7 +5,6 @@ use crate::compiler::AmberCompiler; use crate::test_amber; use crate::tests::compile_code; use std::fs; -use std::io::Write; use std::time::Duration; use std::process::{Command, Stdio}; @@ -33,37 +32,6 @@ fn http_server() { } } -#[test] -fn input() { - let prompt_message = "Please enter your name:"; - - let code = fs::read_to_string("src/tests/stdlib/no_output/input.ab") - .expect(&format!("Failed to open stdlib/no_output/input.ab test file")); - - let input = "Amber"; - let expected_output = format!("{}Hello, {}", prompt_message, input); - - let compiled_code = compile_code(code); - - let mut child = Command::new("bash") - .arg("-c") - .arg(compiled_code) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - .expect("Failed to execute process"); - - { - let stdin = child.stdin.as_mut().expect("Failed to open stdin"); - stdin.write_all(input.as_bytes()).expect("Failed to write to stdin"); - } - - let output = child.wait_with_output().expect("Failed to read stdout"); - let output_str = String::from_utf8(output.stdout).expect("Failed to convert stdout to String"); - - assert_eq!(output_str.trim_end_matches('\n'), expected_output); -} - #[test] fn exit() { let code = fs::read_to_string("src/tests/stdlib/no_output/exit.ab") diff --git a/src/tests/stdlib/no_output/input.ab b/src/tests/stdlib/input.ab similarity index 56% rename from src/tests/stdlib/no_output/input.ab rename to src/tests/stdlib/input.ab index f4dc253a..bbfe2dad 100644 --- a/src/tests/stdlib/no_output/input.ab +++ b/src/tests/stdlib/input.ab @@ -1,5 +1,7 @@ import * from "std/env" main { + unsafe $echo "Amber!" >> /tmp/test_input$ + unsafe $exec 0< /tmp/test_input$ let name = input("Please enter your name:") echo "Hello, " + name } diff --git a/src/tests/stdlib/input.output.txt b/src/tests/stdlib/input.output.txt new file mode 100644 index 00000000..f2b76dd7 --- /dev/null +++ b/src/tests/stdlib/input.output.txt @@ -0,0 +1 @@ +Hello, Amber From e1b4629c71e05989b5e94605aa5c0628fb709dac Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 11:06:26 +0200 Subject: [PATCH 22/26] fix(test): input --- src/std/env.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/env.ab b/src/std/env.ab index f4f081bf..bb54b516 100644 --- a/src/std/env.ab +++ b/src/std/env.ab @@ -55,7 +55,7 @@ pub fun is_command(command: Text): Bool { pub fun input(prompt: Text): Text { unsafe $printf "\${nameof prompt}"$ unsafe $read$ - return "$REPLY" + return "\$REPLY" } pub fun has_failed(command: Text): Bool { From 374ec28eafe3b633ab85847f139ecb505ba142cc Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 11:08:45 +0200 Subject: [PATCH 23/26] fix(test): input --- src/tests/stdlib/input.output.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/stdlib/input.output.txt b/src/tests/stdlib/input.output.txt index f2b76dd7..1f30b05e 100644 --- a/src/tests/stdlib/input.output.txt +++ b/src/tests/stdlib/input.output.txt @@ -1 +1 @@ -Hello, Amber +Please enter your name: Hello, Amber From 4fbea3cde489d4e8364185a6efffc5aa24eea84b Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 11:10:56 +0200 Subject: [PATCH 24/26] fix(test): input --- src/tests/stdlib/input.output.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/stdlib/input.output.txt b/src/tests/stdlib/input.output.txt index 1f30b05e..2486c9f9 100644 --- a/src/tests/stdlib/input.output.txt +++ b/src/tests/stdlib/input.output.txt @@ -1 +1 @@ -Please enter your name: Hello, Amber +Please enter your name:Hello, Amber From e46d4aa1a21ab2ee065ad5991e01c3f96fabd0eb Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 11:13:48 +0200 Subject: [PATCH 25/26] fix(test): input --- src/tests/stdlib/input.output.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/stdlib/input.output.txt b/src/tests/stdlib/input.output.txt index 2486c9f9..22436116 100644 --- a/src/tests/stdlib/input.output.txt +++ b/src/tests/stdlib/input.output.txt @@ -1 +1 @@ -Please enter your name:Hello, Amber +Please enter your name:Hello, Amber \ No newline at end of file From c4dbb7b17d89180eb3b8933860178262b0f34c27 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Tue, 16 Jul 2024 11:18:34 +0200 Subject: [PATCH 26/26] fix(test): input --- src/tests/stdlib/input.ab | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/stdlib/input.ab b/src/tests/stdlib/input.ab index bbfe2dad..fd570a9b 100644 --- a/src/tests/stdlib/input.ab +++ b/src/tests/stdlib/input.ab @@ -1,7 +1,8 @@ import * from "std/env" main { - unsafe $echo "Amber!" >> /tmp/test_input$ + unsafe $echo "Amber" >> /tmp/test_input$ unsafe $exec 0< /tmp/test_input$ let name = input("Please enter your name:") echo "Hello, " + name + unsafe $rm /tmp/test_input$ }