use std::sync::Arc;
use super::RuleType;
use crate::error::ParseErrorKind;
use crate::helpers::{compile_re_pattern, ReWrapper};
use crate::morph::MorphInfo;
use crate::Error;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ParsedRuleGroup {
pub(crate) flag: String,
pub(crate) kind: RuleType,
pub(crate) can_combine: bool,
pub(crate) rules: Vec<ParsedRule>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ParsedRule {
pub(crate) affix: String,
pub(crate) strip: Option<Arc<str>>,
pub(crate) condition: Option<ReWrapper>,
pub(crate) morph_info: Vec<Arc<MorphInfo>>,
}
impl ParsedRule {
#[allow(unused)]
pub(crate) fn new(
kind: RuleType,
affix: &str,
strip: Option<&str>,
condition: Option<&str>,
morph_info: Vec<Arc<MorphInfo>>,
) -> Result<Self, Error> {
let cond_re = match condition {
Some(c) => compile_re_pattern(c, kind)?,
None => None,
};
Ok(Self {
strip: strip.map(Into::into),
affix: affix.to_owned(),
condition: cond_re,
morph_info,
})
}
#[allow(unused)]
pub(crate) fn new_raw_re(
kind: RuleType,
affix: &str,
strip: Option<&str>,
condition: Option<&str>,
morph_info: Vec<Arc<MorphInfo>>,
) -> Result<Self, Error> {
let cond_re = match condition {
Some(c) => Some(ReWrapper::new(c)?),
None => None,
};
Ok(Self {
strip: strip.map(Into::into),
affix: affix.to_owned(),
condition: cond_re,
morph_info,
})
}
pub(crate) fn new_parse(
kind: RuleType,
affix: &str,
strip: &str,
condition: &str,
morph_info: Vec<Arc<MorphInfo>>,
) -> Result<Self, ParseErrorKind> {
let cond_re = compile_re_pattern(condition, kind)?;
let strip_chars = if strip == "0" {
None
} else {
Some(strip.into())
};
Ok(Self {
strip: strip_chars,
affix: affix.to_owned(),
condition: cond_re,
morph_info,
})
}
}