adnv 1.5.0

CLI that tracks, checks and auto-updates infrastructure dependency versions across Terraform, Helm, Docker, Git and npm
Documentation
use crate::parsers::{
    hcl::{Pair, Rule, ast::Str},
    util::pairs,
};

use self::term::ExprTerm;

pub mod term;

#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Expression<'i> {
    Term(ExprTerm<'i>),
}

#[allow(irrefutable_let_patterns)]
impl<'i> Expression<'i> {
    pub fn as_term(&self) -> Option<&ExprTerm<'i>> {
        if let Self::Term(term) = self {
            Some(term)
        } else {
            None
        }
    }

    pub fn as_string(&self) -> Option<Str<'i>> {
        self.as_term().and_then(term::ExprTerm::as_string)
    }

    pub fn as_object(&self) -> Option<&term::object::Object<'i>> {
        self.as_term().and_then(|term| term.as_object())
    }

    pub fn as_tuple(&self) -> Option<&[Expression<'i>]> {
        self.as_term().and_then(|term| term.as_tuple())
    }
}

impl<'i> Expression<'i> {
    pub(super) fn process(pair: Pair<'i>) -> Self {
        let mut items = pair.into_inner();

        let _unary_op = pairs::next_opt(&mut items, Rule::UnaryOperator);
        let expr = items.next().unwrap();

        let expr = ExprTerm::process(expr);

        Expression::Term(expr)
    }
}