clip 0.1.1

A command line parser that doesn't use std or alloc!
Documentation
use crate::{Arg, args, Values, NUM_VALUES};


pub const NUM_ARGS: usize = 32;

#[derive(Debug)]
pub struct App<'a> {
    values: Values<'a>,

    num_flags: usize,
    flags: [Arg<'a>; NUM_ARGS],

    num_names: usize,
    names: [Arg<'a>; NUM_ARGS],
}


impl<'a> App<'a> {
    pub fn new(input: &'a [&'a str]) -> Self {
        Self {
            values: args(input),

            num_flags: 0,
            flags: [Arg::new(""); NUM_ARGS],
            
            num_names: 0,
            names: [Arg::new(""); NUM_ARGS],
        }
    }

    pub fn get(&self, name: &'a str) -> Values<'a> {
        for arg in self.names.iter() {
            if arg.has_name(name) { return arg.get_values() }
        }

        for arg in self.flags.iter() {
            if arg.has_name(name) { return arg.get_values() }
        }

        [""; NUM_VALUES]
    }

    pub fn parse(&mut self) {

        'outer: for _ in 0..NUM_ARGS {
            if self.values[0] == "" { break; }

            for flag in self.flags.iter_mut() {
                if flag.consume(&mut self.values) { continue 'outer; }
            }

            for name in self.names.iter_mut() {
                if name.consume(&mut self.values) { continue 'outer; }
            }
        }
    }

    pub fn arg(mut self, name: &'a str, num_values: i32) -> Self {
        let arg = Arg::new(name).num_values(num_values);

        if arg.is_flag() {
            self.push_flag(arg);
        } else {
            self.push_name(arg);
        }

        self
    }

    pub fn flag(self, name: &'a str, num_values: i32) -> Self {
        self.arg(name, num_values)
    }  

    pub fn name(self, name: &'a str) -> Self {
        self.arg(name, 1)
    }

    pub fn push_flag(&mut self, arg: Arg<'a>) {
        self.num_flags += 1;
        self.flags[self.num_flags] = arg;
    }

    pub fn push_name(&mut self, arg: Arg<'a>) {
        self.num_names += 1;
        self.names[self.num_names] = arg;
    }
}