opstr 1.1.0

‘Operate on strings’ command line utility
Documentation
use crate::config::Configuration;
use crate::errors::LibError;
use crate::input::Args;
use crate::ops::traits;
use crate::output::Output;
use crate::range;

pub struct Concatenate {}

impl Concatenate {
    fn function_for_chars(args: &[&str]) -> String {
        let mut result = String::new();
        for arg in args {
            result.push_str(arg);
        }
        result
    }

    #[doc(hidden)]
    #[allow(dead_code)]
    fn function_for_bytes(args: &[&[u8]]) -> Vec<u8> {
        let mut result = vec![];
        for arg in args {
            result.extend_from_slice(arg);
        }
        result
    }
}

impl traits::Op for Concatenate {
    fn name() -> &'static str { "concatenate" }
    fn usage() -> &'static str { "<#1 string to-concatenate> 0 to … times" }
    fn description() -> &'static str { "concatenate all provided strings" }
    fn acceptable_number_of_arguments() -> range::Range { range::Range::IndexOpen(0) }

    fn priority(args: &Args, _conf: &Configuration) -> Result<f32, LibError> {
        Ok(match args.len() {
            0 | 1 => 0.0,
            2 => 0.34,
            _ => 0.724,
        })
    }

    fn run(args: &Args, _conf: &Configuration) -> Result<Output, LibError> {
        let mut arguments = vec![];
        for arg in args.iter() {
            let s: &str = arg.try_into()?;
            arguments.push(s);
        }
        Ok(Self::function_for_chars(&arguments).into())
    }
}