argc 1.24.0

A bash cli framework, also a bash-based command runner
Documentation
use crate::{
    parser::{EventScope, Position},
    utils::ROOT_NAME,
};

use anyhow::{bail, Result};
use std::collections::HashMap;

#[derive(Default, Debug)]
pub(crate) struct ShareData {
    pub(crate) scope: EventScope,
    pub(crate) name: Option<String>,
    pub(crate) fns: HashMap<String, Position>,
    pub(crate) cmd_fns: HashMap<String, Position>,
    pub(crate) cmd_pos: usize,
    pub(crate) default_fns: Vec<(String, Position)>,
    pub(crate) choice_fns: Vec<(String, Position)>,
}

impl ShareData {
    pub(crate) fn name(&self) -> String {
        match &self.name {
            Some(v) => v.clone(),
            None => ROOT_NAME.to_string(),
        }
    }

    pub(crate) fn add_param_fn(
        &mut self,
        position: usize,
        default_fn: Option<&String>,
        choice_fn: Option<(&String, &bool)>,
    ) {
        if let Some(f) = default_fn {
            self.default_fns.push((f.to_string(), position));
        }
        if let Some((f, _)) = choice_fn {
            self.choice_fns.push((f.to_string(), position));
        }
    }

    pub(crate) fn check_param_fn(&self) -> Result<()> {
        for (name, pos) in self.default_fns.iter() {
            if !self.fns.contains_key(name) {
                bail!("{}(line {}) is missing", name, pos,)
            }
        }
        for (name, pos) in self.choice_fns.iter() {
            if !self.fns.contains_key(name) {
                bail!("{}(line {}) is missing", name, pos,)
            }
        }
        Ok(())
    }
}