diff --git a/src/convert/env.rs b/src/convert/env.rs index 7ff4325..a01848c 100644 --- a/src/convert/env.rs +++ b/src/convert/env.rs @@ -13,7 +13,6 @@ // limitations under the License. //! Contains code for converting a UCG Val into the environment variable output target. -use std::fmt::Write as FmtWrite; use std::io::Write as IOWrite; use std::rc::Rc; @@ -106,18 +105,6 @@ impl Converter for EnvConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!( - h, - "Env conversions expect a tuple. With keys represent the variable name." - ); - writeln!(h, ""); - writeln!(h, "Allowed values can be:"); - writeln!(h, "- Bool converts to true or false"); - writeln!(h, "- Int"); - writeln!(h, "- Float"); - writeln!(h, "- String converted to a quoted string"); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("env_help.txt").to_string() } } diff --git a/src/convert/env_help.txt b/src/convert/env_help.txt new file mode 100644 index 0000000..1fadd37 --- /dev/null +++ b/src/convert/env_help.txt @@ -0,0 +1,9 @@ +Env conversions expect a tuple. With keys represent the variable name. + +Values are converted according to the following rules: + +- Bool converts to "true" or "false" +- Int convert to the string representation of the number +- Float converts to the string representation of the number +- String converts to a quoted string +- All other values are ignored \ No newline at end of file diff --git a/src/convert/exec.rs b/src/convert/exec.rs index f9fbfa2..95dbe94 100644 --- a/src/convert/exec.rs +++ b/src/convert/exec.rs @@ -14,7 +14,6 @@ //! Contains code for converting a UCG Val into an executable script output target. use std; -use std::fmt::Write as FmtWrite; use std::io::{Cursor, Write}; use std::rc::Rc; @@ -141,7 +140,6 @@ impl ExecConverter { } } write!(script, "\n")?; - // TODO(jwall): Should Flag converter have a strict mode? let flag_converter = convert::flags::FlagConverter::new(); // 4. Then construct our command line. (be sure to use exec) write!(script, "exec {} ", command.unwrap())?; @@ -189,36 +187,7 @@ impl Converter for ExecConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!( - h, - "Exec conversions expect a tuple with an expected set of keys." - ); - writeln!(h, ""); - writeln!(h, "The expected keys are:"); - writeln!(h, ""); - writeln!(h, "- command (string, required)"); - writeln!(h, "\t The command to run in the script."); - writeln!(h, ""); - writeln!(h, "- env (tuple, optional)"); - writeln!( - h, - "\t Any environment variables that should be set in the script." - ); - writeln!( - h, - "\t The env tuple is converted using the same rules as the env converter." - ); - writeln!(h, ""); - writeln!(h, "- args (tuple, optional"); - writeln!(h, "\t Any command line arguments for the command line."); - writeln!( - h, - "\t The arguments are converted using the same rules as the flags converter." - ); - writeln!(h, ""); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("exec_help.txt").to_string() } } diff --git a/src/convert/exec_help.txt b/src/convert/exec_help.txt new file mode 100644 index 0000000..a362c38 --- /dev/null +++ b/src/convert/exec_help.txt @@ -0,0 +1,16 @@ +Exec conversions expect a tuple with an expected set of keys. + +The expected keys are: + +- command (string, required) + The command to run in the script. + +- env (tuple, optional) + Any environment variables that should be set in the script. + The env tuple is converted using the same rules as the env converter. + +- args (tuple, optional + Any command line arguments for the command line. + The arguments are converted using the same rules as the flags converter. + +- Functions and Modules are ignored. \ No newline at end of file diff --git a/src/convert/flags.rs b/src/convert/flags.rs index d61c3f3..77447cc 100644 --- a/src/convert/flags.rs +++ b/src/convert/flags.rs @@ -13,7 +13,6 @@ // limitations under the License. //! Contains code for converting a UCG Val into the command line flag output target. -use std::fmt::Write as FmtWrite; use std::io::Write; use std::rc::Rc; @@ -22,11 +21,18 @@ use crate::convert::traits::{ConvertResult, Converter}; /// FlagConverter implements the conversion logic for converting a Val into a set /// of command line flags. -pub struct FlagConverter {} +pub struct FlagConverter { + sep: &'static str, +} impl FlagConverter { pub fn new() -> Self { - FlagConverter {} + FlagConverter { sep: "." } + } + + pub fn with_sep(mut self, sep: &'static str) -> Self { + self.sep = sep; + self } fn write_flag_name(&self, pfx: &str, name: &str, w: &mut Write) -> ConvertResult { @@ -90,7 +96,7 @@ impl FlagConverter { } match val.as_ref() { &Val::Tuple(_) => { - let new_pfx = format!("{}{}.", pfx, name); + let new_pfx = format!("{}{}{}", pfx, name, self.sep); self.write(&new_pfx, val, w)?; } &Val::List(ref def) => { @@ -135,34 +141,6 @@ impl Converter for FlagConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!( - h, - "Flags converts a tuple into a set of command line arguments for command line application." - ); - writeln!(h, ""); - writeln!(h, "The flags are converted using the following rules:"); - writeln!(h, ""); - writeln!(h, "- keys in a tuple are converted into the argument name."); - writeln!( - h, - "- values in a tuple are converted into the argument value." - ); - writeln!(h, "- NULL values are not emitted"); - writeln!( - h, - "- lists expand out into an argument for each item in the list." - ); - writeln!(h, "\te.g. {{foo = [1, 2]}} becomes --foo=1 --foo=2"); - writeln!( - h, - "- tuples expand out into an argument with the key as a prefix separated by a `.`." - ); - writeln!( - h, - "\te.g. {{foo = {{bar = 1, baz = 2}}}} becomes --foo.bar=1 --foo.baz=2" - ); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("flags_help.txt").to_string() } } diff --git a/src/convert/flags_help.txt b/src/convert/flags_help.txt new file mode 100644 index 0000000..9dd638a --- /dev/null +++ b/src/convert/flags_help.txt @@ -0,0 +1,12 @@ +Flags converts a tuple into a set of command line arguments for command line application. + +The flags are converted using the following rules: + +- keys in a tuple are converted into the argument name. +- values in a tuple are converted into the argument value. +- NULL values are not emitted. +- lists expand out into an argument for each item in the list. + e.g. {{foo = [1, 2]}} becomes --foo=1 --foo=2 +- tuples expand out into an argument with the key as a prefix separated by a `.`. + e.g. {{foo = {{bar = 1, baz = 2}}}} becomes --foo.bar=1 --foo.baz=2 +- Functions and Modules are ignored. \ No newline at end of file diff --git a/src/convert/json.rs b/src/convert/json.rs index a3b24d5..f8fe83e 100644 --- a/src/convert/json.rs +++ b/src/convert/json.rs @@ -10,7 +10,6 @@ //! Flags contains code for converting a UCG Val into the json output target. use std; use std::error::Error; -use std::fmt::Write as FmtWrite; use std::io::Write; use std::rc::Rc; @@ -139,20 +138,7 @@ impl Converter for JsonConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!(h, "JSON conversions expect any ucg value."); - writeln!(h, ""); - writeln!( - h, - "They are transformed into json using the following rules:" - ); - writeln!(h, "- NULL becomes null"); - writeln!(h, "- tuples become objects {{}}"); - writeln!(h, "- lists become lists []"); - writeln!(h, "- Int and Float become numbers"); - writeln!(h, "- Strings become strings."); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("json_help.txt").to_string() } } diff --git a/src/convert/json_help.txt b/src/convert/json_help.txt new file mode 100644 index 0000000..920c180 --- /dev/null +++ b/src/convert/json_help.txt @@ -0,0 +1,10 @@ +JSON conversions expect any ucg value. + +They are transformed into json using the following rules: + +- NULL becomes `null` +- tuples become objects `{...}` +- lists become lists `[...]` +- Int and Float become numbers +- Strings become strings. +- Functions and Modules are ignored. \ No newline at end of file diff --git a/src/convert/toml.rs b/src/convert/toml.rs index 7c35deb..a925000 100644 --- a/src/convert/toml.rs +++ b/src/convert/toml.rs @@ -15,7 +15,6 @@ use std; use std::error; use std::error::Error; -use std::fmt::Write as FmtWrite; use std::io::Write; use std::rc::Rc; @@ -131,24 +130,7 @@ impl Converter for TomlConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!(h, "TOML conversions expect any ucg value."); - writeln!(h, ""); - writeln!( - h, - "They are transformed into toml using the following rules:" - ); - writeln!(h, "- tuples become maps {{}}"); - writeln!(h, "- lists become lists []"); - writeln!(h, "- Int becomes an Int"); - writeln!(h, "- Float becomes a Float"); - writeln!(h, "- Strings become Strings."); - writeln!( - h, - "- NULL is not allowed in toml documents and will generate a compile error" - ); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("toml_help.txt").to_string() } } diff --git a/src/convert/toml_help.txt b/src/convert/toml_help.txt new file mode 100644 index 0000000..2b252ef --- /dev/null +++ b/src/convert/toml_help.txt @@ -0,0 +1,11 @@ +TOML conversions expect any ucg value. + +They are transformed into toml using the following rules: + +- tuples become maps `{...}` +- lists become lists `[...]` +- Int becomes an Int +- Float becomes a Float +- Strings become Strings. +- NULL is not allowed in toml documents and will generate a compile error +- Functions and Modules are ignored. \ No newline at end of file diff --git a/src/convert/xml.rs b/src/convert/xml.rs index e5d8c95..55b421c 100644 --- a/src/convert/xml.rs +++ b/src/convert/xml.rs @@ -14,7 +14,6 @@ use std; use std::error::Error; -use std::fmt::Write as FmtWrite; use std::io::Write; use std::rc::Rc; @@ -238,40 +237,6 @@ impl Converter for XmlConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!(h, "XML converts ucg tuples into xml documents."); - writeln!(h, ""); - writeln!(h, "The tuple converts into xml using a declarative DSL."); - writeln!(h, "The top tuple describes the xml document:"); - writeln!( - h, - "{{ - version = \"1.1\" // Optional, Defaults to 1.1 - encoding = \"utf-8\" // Optional, Defaults to UTF-8 - standalone = true // Optional Defaults to false - root = {{ // Required defines the root element of the document. - name = \"top\", - }} -}};" - ); - writeln!(h, "XML nodes are constructed like :"); - writeln!( - h, - "{{ - name = \"ns:element-name\", - ns = {{ - prefix = \"myns\", - uri = \"http://example.org\", - }}, - attrs = {{ - id = \"foo\", - }}, - children = [ - // child elements go here. - ], -}};" - ); - writeln!(h, "Text nodes are just strings."); - h + include_str!("xml_help.txt").to_string() } } diff --git a/src/convert/xml_help.txt b/src/convert/xml_help.txt new file mode 100644 index 0000000..ac9f35a --- /dev/null +++ b/src/convert/xml_help.txt @@ -0,0 +1,29 @@ +XML converts ucg tuples into xml documents. + +The tuple converts into xml using a declarative DSL. +The top tuple describes the xml document: +{ + version = "1.1" // Optional, Defaults to 1.1 + encoding = "utf-8" // Optional, Defaults to UTF-8 + standalone = true // Optional, Defaults to false + root = { // Required, defines the root element of the document. + name = "top", + } +}; + +XML nodes are constructed like so: +{ + name = "ns:element-name", + ns = { + prefix = "myns", + uri = "http://example.org", + }, + attrs = { + id = "foo", + }, + children = [ + // child elements go here. + ], +}; + +Text nodes are just strings. \ No newline at end of file diff --git a/src/convert/yaml.rs b/src/convert/yaml.rs index 03d7a6f..1d4fffb 100644 --- a/src/convert/yaml.rs +++ b/src/convert/yaml.rs @@ -1,6 +1,5 @@ use std; use std::error::Error; -use std::fmt::Write as FmtWrite; use std::io::Write; use std::rc::Rc; use std::result::Result; @@ -136,20 +135,7 @@ impl Converter for YamlConverter { #[allow(unused_must_use)] fn help(&self) -> String { - let mut h = String::new(); - writeln!(h, "YAML conversions expect any ucg value."); - writeln!(h, ""); - writeln!( - h, - "They are transformed into toml using the following rules:" - ); - writeln!(h, "- tuples become maps {{}}"); - writeln!(h, "- lists become lists []"); - writeln!(h, "- Int becomes an Int"); - writeln!(h, "- Float becomes a Float"); - writeln!(h, "- Strings become Strings."); - writeln!(h, "- Functions and Modules are ignored."); - h + include_str!("yaml_help.txt").to_string() } } diff --git a/src/convert/yaml_help.txt b/src/convert/yaml_help.txt new file mode 100644 index 0000000..b8fcabc --- /dev/null +++ b/src/convert/yaml_help.txt @@ -0,0 +1,10 @@ +YAML conversions expect any UCG value. + +They are transformed into toml using the following rules: + +- tuples become maps `{...}` +- lists become lists `[...]` +- Int becomes an Int +- Float becomes a Float +- Strings become Strings. +- Functions and Modules are ignored. \ No newline at end of file