diff --git a/src/error.rs b/src/error.rs index 79ad1a3..49398f2 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,8 +3,8 @@ //! To deal with errors from dependencies, either create a new error variant //! or use the MacroFailure variant if the error can only occur inside a macro. use crate::{ - operator::Operator, token::PartialToken, value::value_type::ValueType, value::Value, MacroInfo, - Node, + operator::Operator, token::PartialToken, value::value_type::ValueType, value::Value, Node, + ToolInfo, }; use std::{fmt, io, time::SystemTimeError}; @@ -133,7 +133,7 @@ pub enum Error { /// A macro or function was called with the wrong type of input. MacroArgumentType { /// The macro that was called. - macro_info: MacroInfo<'static>, + macro_info: ToolInfo<'static>, /// The actual value. actual: Value, }, diff --git a/src/interface.rs b/src/interface.rs index 850e94c..a20bdde 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -5,7 +5,7 @@ use crate::{token, tree, Result, Value, VariableMap}; /// # Examples /// /// ```rust -/// # use whale_lib::*; +/// # use dust_lib::*; /// assert_eq!(eval("1 + 2 + 3"), Ok(Value::from(6))); /// ``` /// @@ -20,12 +20,12 @@ pub fn eval(string: &str) -> Result { /// # Examples /// /// ```rust -/// # use whale_lib::*; +/// # use dust_lib::*; /// let mut context = VariableMap::new(); /// context.set_value("one".into(), 1.into()).unwrap(); // Do proper error handling here /// context.set_value("two".into(), 2.into()).unwrap(); // Do proper error handling here /// context.set_value("three".into(), 3.into()).unwrap(); // Do proper error handling here -/// assert_eq!(eval_with_context("one + two + three", &context), Ok(Value::from(6))); +/// assert_eq!(eval_with_context("one + two + three", &mut context), Ok(Value::from(6))); /// ``` /// /// *See the [crate doc](index.html) for more examples and explanations of the expression format.* diff --git a/src/lib.rs b/src/lib.rs index 37fa1da..ee4f8db 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,11 +2,11 @@ #![forbid(unsafe_code)] pub use crate::{ - commands::*, error::*, interface::*, operator::Operator, token::PartialToken, + tools::{Tool, ToolInfo, TOOL_LIST}, tree::Node, value::{ function::Function, table::Table, time::Time, value_type::ValueType, @@ -14,7 +14,8 @@ pub use crate::{ }, }; -mod commands; +pub mod tools; + mod error; mod interface; mod operator; diff --git a/src/main.rs b/src/main.rs index 02169a3..59963ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,8 @@ use std::{ path::PathBuf, }; -use whale_lib::{ - eval, eval_with_context, gui::GuiApp, Macro, MacroInfo, Result, Value, VariableMap, MACRO_LIST, +use dust_lib::{ + eval, eval_with_context, gui::GuiApp, Result, Tool, ToolInfo, Value, VariableMap, TOOL_LIST, }; /// Command-line arguments to be parsed. @@ -113,11 +113,11 @@ impl WhaleCompeleter { } } - pub fn set_macro_list(&mut self, macro_list: Vec<&'static dyn Macro>) -> &mut Self { + pub fn set_command_list(&mut self, macro_list: Vec<&'static dyn Tool>) -> &mut Self { self.macro_list = macro_list .iter() .map(|r#macro| { - let MacroInfo { + let ToolInfo { identifier, description, group, @@ -204,7 +204,7 @@ impl Completer for WhaleCompeleter { fn setup_reedline() -> Reedline { let mut completer = Box::new(WhaleCompeleter::new()); - completer.set_macro_list(MACRO_LIST.to_vec()); + completer.set_command_list(TOOL_LIST.to_vec()); let completion_menu = Box::new( ColumnarMenu::default() diff --git a/src/commands/collections.rs b/src/tools/collections.rs similarity index 92% rename from src/commands/collections.rs rename to src/tools/collections.rs index 43df7ed..91f30af 100644 --- a/src/commands/collections.rs +++ b/src/tools/collections.rs @@ -1,12 +1,12 @@ //! Macros for collection values: strings, lists, maps and tables. -use crate::{Error, Macro, MacroInfo, Result, Table, Value, ValueType, VariableMap}; +use crate::{Error, Result, Table, Tool, ToolInfo, Value, ValueType, VariableMap}; pub struct Transform; -impl Macro for Transform { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Transform { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "transform", description: "Alter a collection by calling a function on each value.", group: "collections", @@ -53,9 +53,9 @@ impl Macro for Transform { pub struct String; -impl Macro for String { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for String { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "string", description: "Stringify a value.", group: "collections", @@ -83,9 +83,9 @@ impl Macro for String { pub struct Count; -impl Macro for Count { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Count { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "count", description: "Return the number of items in a value.", group: "collections", @@ -113,9 +113,9 @@ impl Macro for Count { pub struct CreateTable; -impl Macro for CreateTable { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for CreateTable { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "create_table", description: "Define a new table with a list of column names and list of rows.", group: "collections", @@ -149,9 +149,9 @@ impl Macro for CreateTable { pub struct Rows; -impl Macro for Rows { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Rows { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "rows", description: "Extract a table's rows as a list.", group: "collections", @@ -174,9 +174,9 @@ impl Macro for Rows { pub struct Get; -impl Macro for Get { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Get { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "get", description: "Retrieve a value from a collection.", group: "collections", @@ -207,9 +207,9 @@ impl Macro for Get { pub struct Insert; -impl Macro for Insert { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Insert { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "insert", description: "Add new rows to a table.", group: "collections", @@ -236,9 +236,9 @@ impl Macro for Insert { pub struct Select; -impl Macro for Select { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Select { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "select", description: "Extract one or more values based on their key.", group: "collections", @@ -305,9 +305,9 @@ impl Macro for Select { pub struct ForEach; -impl Macro for ForEach { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ForEach { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "for_each", description: "Run an operation on every item in a collection.", group: "collections", @@ -342,9 +342,9 @@ impl Macro for ForEach { pub struct Where; -impl Macro for Where { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Where { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "where", description: "Keep rows matching a predicate.", group: "collections", diff --git a/src/commands/command.rs b/src/tools/command.rs similarity index 81% rename from src/commands/command.rs rename to src/tools/command.rs index b18f9d3..40d72aa 100644 --- a/src/commands/command.rs +++ b/src/tools/command.rs @@ -1,12 +1,12 @@ use std::process::Command; -use crate::{Macro, MacroInfo, Result, Value}; +use crate::{Result, Tool, ToolInfo, Value}; pub struct Sh; -impl Macro for Sh { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Sh { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "sh", description: "Pass input to the Bourne Shell.", group: "command", @@ -25,9 +25,9 @@ impl Macro for Sh { pub struct Bash; -impl Macro for Bash { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Bash { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "bash", description: "Pass input to the Bourne Again Shell.", group: "command", @@ -49,9 +49,9 @@ impl Macro for Bash { } pub struct Fish; -impl Macro for Fish { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Fish { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "fish", description: "Pass input to the fish shell.", group: "command", @@ -74,9 +74,9 @@ impl Macro for Fish { pub struct Zsh; -impl Macro for Zsh { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Zsh { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "zsh", description: "Pass input to the Z shell.", group: "command", @@ -99,9 +99,9 @@ impl Macro for Zsh { pub struct Raw; -impl Macro for Raw { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Raw { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "raw", description: "Run input as a command without a shell", group: "command", diff --git a/src/commands/data_formats.rs b/src/tools/data_formats.rs similarity index 90% rename from src/commands/data_formats.rs rename to src/tools/data_formats.rs index 7300c03..1746c55 100644 --- a/src/commands/data_formats.rs +++ b/src/tools/data_formats.rs @@ -1,12 +1,12 @@ //! Convert values to and from data formats like JSON and TOML. -use crate::{Macro, MacroInfo, Result, Table, Value, ValueType}; +use crate::{Result, Table, Tool, ToolInfo, Value, ValueType}; pub struct FromJson; -impl Macro for FromJson { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for FromJson { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "from_json", description: "Get a whale value from a JSON string.", group: "data", @@ -24,9 +24,9 @@ impl Macro for FromJson { pub struct ToJson; -impl Macro for ToJson { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ToJson { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "to_json", description: "Create a JSON string from a whale value.", group: "data", @@ -43,9 +43,9 @@ impl Macro for ToJson { pub struct FromCsv; -impl Macro for FromCsv { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for FromCsv { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "from_csv", description: "Create a whale value from a CSV string.", group: "data", @@ -90,9 +90,9 @@ impl Macro for FromCsv { pub struct ToCsv; -impl Macro for ToCsv { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ToCsv { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "to_csv", description: "Convert a value to a string of comma-separated values.", group: "data", diff --git a/src/commands/disks.rs b/src/tools/disks.rs similarity index 93% rename from src/commands/disks.rs rename to src/tools/disks.rs index 377f6e2..c47e225 100644 --- a/src/commands/disks.rs +++ b/src/tools/disks.rs @@ -2,13 +2,13 @@ use std::process::Command; use sysinfo::{DiskExt, System, SystemExt}; -use crate::{Macro, MacroInfo, Result, Table, Value}; +use crate::{Result, Table, Tool, ToolInfo, Value}; pub struct ListDisks; -impl Macro for ListDisks { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ListDisks { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "list_disks", description: "List all block devices.", group: "disks", @@ -60,9 +60,9 @@ impl Macro for ListDisks { pub struct Partition; -impl Macro for Partition { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Partition { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "partition", description: "Partition a disk, clearing its content.", group: "disks", diff --git a/src/commands/filesystem.rs b/src/tools/filesystem.rs similarity index 84% rename from src/commands/filesystem.rs rename to src/tools/filesystem.rs index 11bae09..eb32657 100644 --- a/src/commands/filesystem.rs +++ b/src/tools/filesystem.rs @@ -1,22 +1,24 @@ -//! Tools for files and directories. - +//! Dust commands for managing files and directories. use std::{ fs::{self, OpenOptions}, io::{Read, Write as IoWrite}, path::PathBuf, }; -use crate::{Error, Macro, MacroInfo, Result, Table, Time, Value, ValueType}; +use crate::{Error, Result, Table, Time, Tool, ToolInfo, Value, ValueType}; pub struct Append; -impl Macro for Append { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Append { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "append", description: "Append data to a file.", group: "filesystem", - inputs: vec![], + inputs: vec![ValueType::ListExact(vec![ + ValueType::String, + ValueType::Any, + ])], } } @@ -34,13 +36,16 @@ impl Macro for Append { pub struct CreateDir; -impl Macro for CreateDir { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for CreateDir { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "create_dir", description: "Create one or more directories.", group: "filesystem", - inputs: vec![], + inputs: vec![ + ValueType::String, + ValueType::ListOf(Box::new(ValueType::String)), + ], } } @@ -54,13 +59,16 @@ impl Macro for CreateDir { pub struct FileMetadata; -impl Macro for FileMetadata { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for FileMetadata { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "file_metadata", description: "Get metadata for files.", group: "filesystem", - inputs: vec![], + inputs: vec![ + ValueType::String, + ValueType::ListOf(Box::new(ValueType::String)), + ], } } @@ -97,9 +105,9 @@ impl Macro for FileMetadata { pub struct ReadDir; -impl Macro for ReadDir { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ReadDir { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "read_dir", description: "Read the content of a directory.", group: "filesystem", @@ -168,9 +176,9 @@ impl Macro for ReadDir { pub struct ReadFile; -impl Macro for ReadFile { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for ReadFile { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "read_file", description: "Read file contents.", group: "filesystem", @@ -194,13 +202,16 @@ impl Macro for ReadFile { pub struct RemoveDir; -impl Macro for RemoveDir { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RemoveDir { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "remove_dir", description: "Remove directories.", group: "filesystem", - inputs: vec![], + inputs: vec![ + ValueType::String, + ValueType::ListOf(Box::new(ValueType::String)), + ], } } @@ -214,13 +225,16 @@ impl Macro for RemoveDir { pub struct MoveDir; -impl Macro for MoveDir { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for MoveDir { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "move_dir", description: "Move a directory to a new path.", group: "filesystem", - inputs: vec![], + inputs: vec![ValueType::ListExact(vec![ + ValueType::String, + ValueType::String, + ])], } } @@ -252,13 +266,16 @@ impl Macro for MoveDir { pub struct Trash; -impl Macro for Trash { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Trash { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "trash", description: "Move a file or directory to the trash.", group: "filesystem", - inputs: vec![], + inputs: vec![ + ValueType::String, + ValueType::ListOf(Box::new(ValueType::String)), + ], } } @@ -273,13 +290,16 @@ impl Macro for Trash { pub struct Write; -impl Macro for Write { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Write { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "write", description: "Write data to a file.", group: "filesystem", - inputs: vec![], + inputs: vec![ValueType::ListExact(vec![ + ValueType::String, + ValueType::Any, + ])], } } @@ -307,9 +327,9 @@ impl Macro for Write { pub struct RemoveFile; -impl Macro for RemoveFile { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RemoveFile { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "remove_file", description: "Permanently delete a file.", group: "filesystem", @@ -343,13 +363,13 @@ impl Macro for RemoveFile { pub struct Watch; -impl Macro for Watch { - fn info(&self) -> crate::MacroInfo<'static> { - crate::MacroInfo { +impl Tool for Watch { + fn info(&self) -> crate::ToolInfo<'static> { + crate::ToolInfo { identifier: "watch", description: "Wait until a file changes.", group: "filesystem", - inputs: vec![], + inputs: vec![ValueType::String], } } diff --git a/src/commands/general.rs b/src/tools/general.rs similarity index 84% rename from src/commands/general.rs rename to src/tools/general.rs index ed026e8..7d32a76 100644 --- a/src/commands/general.rs +++ b/src/tools/general.rs @@ -2,13 +2,13 @@ use std::{fs, thread::sleep, time::Duration}; use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; -use crate::{Function, Macro, MacroInfo, Result, Value}; +use crate::{Function, Result, Tool, ToolInfo, Value}; pub struct Output; -impl Macro for Output { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Output { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "output", description: "Print a value.", group: "general", @@ -24,9 +24,9 @@ impl Macro for Output { } pub struct Repeat; -impl Macro for Repeat { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Repeat { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "repeat", description: "Run a function the given number of times.", group: "general", @@ -52,9 +52,9 @@ impl Macro for Repeat { pub struct Run; -impl Macro for Run { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Run { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "run", description: "Run a whale file.", group: "general", @@ -72,9 +72,9 @@ impl Macro for Run { pub struct Async; -impl Macro for Async { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Async { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "async", description: "Run functions in parallel.", group: "general", @@ -106,9 +106,9 @@ impl Macro for Async { pub struct Wait; -impl Macro for Wait { - fn info(&self) -> crate::MacroInfo<'static> { - MacroInfo { +impl Tool for Wait { + fn info(&self) -> crate::ToolInfo<'static> { + ToolInfo { identifier: "wait", description: "Wait for the given number of milliseconds.", group: "general", diff --git a/src/commands/gui.rs b/src/tools/gui.rs similarity index 96% rename from src/commands/gui.rs rename to src/tools/gui.rs index 319c761..4b42676 100644 --- a/src/commands/gui.rs +++ b/src/tools/gui.rs @@ -9,13 +9,13 @@ use eframe::{ }; use egui_extras::{Column, StripBuilder, TableBuilder}; -use crate::{eval_with_context, Error, Macro, MacroInfo, Result, Table, Value, VariableMap}; +use crate::{eval_with_context, Error, Result, Table, Tool, ToolInfo, Value, VariableMap}; pub struct CreateLine; -impl Macro for CreateLine { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for CreateLine { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "create_line", description: "Create a map value to be shown as a line in a plot.", group: "gui", @@ -40,9 +40,9 @@ impl Macro for CreateLine { pub struct BarGraph; -impl Macro for BarGraph { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for BarGraph { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "bar_graph", description: "Render a list of values as a bar graph.", group: "gui", @@ -125,9 +125,9 @@ impl eframe::App for BarGraphGui { pub struct Plot; -impl Macro for Plot { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Plot { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "plot", description: "Render a list of numbers as a scatter plot graph.", group: "gui", @@ -193,9 +193,9 @@ impl eframe::App for PlotGui { pub struct Gui; -impl Macro for Gui { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Gui { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "gui", description: "Display a value in a GUI window.", group: "gui", diff --git a/src/commands/logic.rs b/src/tools/logic.rs similarity index 88% rename from src/commands/logic.rs rename to src/tools/logic.rs index 819d43b..5cb6fad 100644 --- a/src/commands/logic.rs +++ b/src/tools/logic.rs @@ -1,11 +1,11 @@ -use crate::{Error, Macro, MacroInfo, Result, Value, ValueType }; +use crate::{Error, Tool, ToolInfo, Result, Value, ValueType }; pub struct Assert; -impl Macro for Assert { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Assert { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "assert", description: "Panic if a boolean is false.", group: "test", @@ -30,9 +30,9 @@ impl Macro for Assert { pub struct AssertEqual; -impl Macro for AssertEqual { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for AssertEqual { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "assert_equal", description: "Panic if two values do not match.", group: "test", @@ -54,9 +54,9 @@ impl Macro for AssertEqual { pub struct If; -impl Macro for If { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for If { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "if", description: "Evaluates the first argument. If true, it does the second argument.", group: "logic", @@ -92,9 +92,9 @@ impl Macro for If { pub struct IfElse; -impl Macro for IfElse { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for IfElse { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "if_else", description: "Evaluates the first argument. If true, it does the second argument. If false, it does the third argument", group: "logic", @@ -139,9 +139,9 @@ impl Macro for IfElse { pub struct Loop; -impl Macro for Loop { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Loop { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "loop", description: "Repeats a function until the program ends.", group: "general", diff --git a/src/commands/mod.rs b/src/tools/mod.rs similarity index 92% rename from src/commands/mod.rs rename to src/tools/mod.rs index 580b055..9f097c7 100644 --- a/src/commands/mod.rs +++ b/src/tools/mod.rs @@ -2,17 +2,27 @@ //! //! ## Writing macros //! -//! - snake case identifier, this is enforced by a test -//! - the description should be brief, it will display in the shell -//! +//! - Snake case identifier, this is enforced by a test +//! - The description should be brief, it will display in the shell +//! - Recycle code that is already written and tested +//! - Write non-trivial tests, do not write tests just for the sake of writing them //! //! ## Usage //! -//! Macros can be used in Rust by passing a Value to the run method. +//! Commands can be used in Rust by passing a Value to the run method. //! //! ``` -//! let value = Value::List(vec![1, 2,3]); -//! let count = Count.run(value).as_string().unwrap(); +//! # use dust_lib::{tools::collections::Count, Tool, Value}; +//! let value = Value::List(vec![ +//! Value::Integer(1), +//! Value::Integer(2), +//! Value::Integer(3), +//! ]); +//! let count = Count +//! .run(&value) +//! .unwrap() +//! .as_int() +//! .unwrap(); //! //! assert_eq!(count, 3); //! ``` @@ -37,7 +47,7 @@ pub mod time; /// /// This list is used to match identifiers with macros and to provide info to /// the shell. -pub const MACRO_LIST: [&'static dyn Macro; 57] = [ +pub const TOOL_LIST: [&'static dyn Tool; 57] = [ &collections::Count, &collections::CreateTable, &collections::Get, @@ -98,14 +108,14 @@ pub const MACRO_LIST: [&'static dyn Macro; 57] = [ ]; /// A whale macro function. -pub trait Macro: Sync + Send { - fn info(&self) -> MacroInfo<'static>; +pub trait Tool: Sync + Send { + fn info(&self) -> ToolInfo<'static>; fn run(&self, argument: &Value) -> Result; } /// Information needed for each macro. #[derive(Clone, Debug, PartialEq)] -pub struct MacroInfo<'a> { +pub struct ToolInfo<'a> { /// Text pattern that triggers this macro. pub identifier: &'a str, @@ -350,7 +360,7 @@ mod tests { #[test] fn macro_formatting() { - for function in MACRO_LIST { + for function in TOOL_LIST { let identifier = function.info().identifier; assert_eq!(identifier.to_lowercase(), identifier); diff --git a/src/commands/network.rs b/src/tools/network.rs similarity index 76% rename from src/commands/network.rs rename to src/tools/network.rs index a0f6fcb..22b9253 100644 --- a/src/commands/network.rs +++ b/src/tools/network.rs @@ -1,12 +1,12 @@ //! Macros for network access. -use crate::{Macro, MacroInfo, Result, Value}; +use crate::{Result, Tool, ToolInfo, Value}; pub struct Download; -impl Macro for Download { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Download { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "download", description: "Fetch a network resource.", group: "network", diff --git a/src/commands/package_management.rs b/src/tools/package_management.rs similarity index 88% rename from src/commands/package_management.rs rename to src/tools/package_management.rs index 77176a6..39a859d 100644 --- a/src/commands/package_management.rs +++ b/src/tools/package_management.rs @@ -1,12 +1,12 @@ use std::process::Command; -use crate::{Error, Macro, MacroInfo, Result, Value}; +use crate::{Error, Result, Tool, ToolInfo, Value}; pub struct CoprRepositories; -impl Macro for CoprRepositories { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for CoprRepositories { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "enable_copr_repository", description: "Enable one or more COPR repositories.", group: "package management", @@ -37,9 +37,9 @@ impl Macro for CoprRepositories { pub struct InstallPackage; -impl Macro for InstallPackage { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for InstallPackage { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "install_package", description: "Install one or more packages.", group: "package management", @@ -73,9 +73,9 @@ impl Macro for InstallPackage { pub struct EnableRpmRepositories; -impl Macro for EnableRpmRepositories { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for EnableRpmRepositories { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "enable_rpm_repositories", description: "Enable one or more RPM repositories.", group: "package management", @@ -110,9 +110,9 @@ impl Macro for EnableRpmRepositories { pub struct UninstallPackage; -impl Macro for UninstallPackage { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for UninstallPackage { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "uninstall_package", description: "Uninstall one or more packages.", group: "package management", @@ -146,9 +146,9 @@ impl Macro for UninstallPackage { pub struct UpgradePackages; -impl Macro for UpgradePackages { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for UpgradePackages { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "upgrade_packages", description: "Upgrade all installed packages.", group: "package management", diff --git a/src/commands/random.rs b/src/tools/random.rs similarity index 87% rename from src/commands/random.rs rename to src/tools/random.rs index 9cf9ec8..d3e942d 100644 --- a/src/commands/random.rs +++ b/src/tools/random.rs @@ -2,13 +2,13 @@ use std::convert::TryInto; use rand::{random, thread_rng, Rng}; -use crate::{Error, Macro, MacroInfo, Result, Value}; +use crate::{Error, Result, Tool, ToolInfo, Value}; pub struct RandomBoolean; -impl Macro for RandomBoolean { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RandomBoolean { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "random_boolean", description: "Create a random boolean.", group: "random", @@ -27,9 +27,9 @@ impl Macro for RandomBoolean { pub struct RandomInteger; -impl Macro for RandomInteger { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RandomInteger { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "random_integer", description: "Create a random integer.", group: "random", @@ -61,9 +61,9 @@ impl Macro for RandomInteger { pub struct RandomString; -impl Macro for RandomString { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RandomString { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "random_string", description: "Generate a random string.", group: "random", @@ -105,9 +105,9 @@ impl Macro for RandomString { pub struct RandomFloat; -impl Macro for RandomFloat { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for RandomFloat { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "random_float", description: "Generate a random floating point value between 0 and 1.", group: "random", @@ -124,9 +124,9 @@ impl Macro for RandomFloat { pub struct Random; -impl Macro for Random { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Random { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "random", description: "Select a random item from a collection.", group: "random", diff --git a/src/commands/system.rs b/src/tools/system.rs similarity index 75% rename from src/commands/system.rs rename to src/tools/system.rs index 5a5f121..2668d4f 100644 --- a/src/commands/system.rs +++ b/src/tools/system.rs @@ -1,12 +1,12 @@ use sys_info::cpu_speed; -use crate::{Macro, MacroInfo, Result, Value}; +use crate::{Result, Tool, ToolInfo, Value}; pub struct CpuSpeed; -impl Macro for CpuSpeed { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for CpuSpeed { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "cpu_speed", description: "Return the current processor speed in megahertz.", group: "system", diff --git a/src/commands/time.rs b/src/tools/time.rs similarity index 77% rename from src/commands/time.rs rename to src/tools/time.rs index 8bc12f0..0981aad 100644 --- a/src/commands/time.rs +++ b/src/tools/time.rs @@ -1,12 +1,12 @@ use std::time::Instant; -use crate::{Macro, MacroInfo, Result, Time, Value}; +use crate::{Result, Time, Tool, ToolInfo, Value}; pub struct Now; -impl Macro for Now { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Now { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "now", description: "Return the current time.", group: "time", @@ -25,9 +25,9 @@ impl Macro for Now { pub struct Local; -impl Macro for Local { - fn info(&self) -> MacroInfo<'static> { - MacroInfo { +impl Tool for Local { + fn info(&self) -> ToolInfo<'static> { + ToolInfo { identifier: "local", description: "Show a time value adjusted for the current time zone.", group: "time", diff --git a/src/value/variable_map.rs b/src/value/variable_map.rs index 7c9e409..6595401 100644 --- a/src/value/variable_map.rs +++ b/src/value/variable_map.rs @@ -4,7 +4,7 @@ use std::{ fmt::{self, Display, Formatter}, }; -use crate::{value::Value, Error, Result, Table, MACRO_LIST}; +use crate::{value::Value, Error, Result, Table, TOOL_LIST}; /// A context that stores its mappings in hash maps. #[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Eq, Serialize, Deserialize)] @@ -21,7 +21,7 @@ impl VariableMap { } pub fn call_function(&self, identifier: &str, argument: &Value) -> Result { - for macro_item in MACRO_LIST { + for macro_item in TOOL_LIST { let valid_input_types = macro_item.info().inputs; if identifier == macro_item.info().identifier { diff --git a/tests/dust_tests.rs b/tests/dust_tests.rs index 895de3d..04c5b0e 100644 --- a/tests/dust_tests.rs +++ b/tests/dust_tests.rs @@ -1,6 +1,6 @@ use std::fs::read_to_string; -use whale_lib::*; +use dust_lib::*; #[test] fn collections() {