use alloc::{
borrow::Cow,
format,
string::{String, ToString},
};
use core::str::FromStr;
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub enum IrFilter {
#[default]
Any,
Symbol(Option<Cow<'static, str>>),
Op {
dialect: midenc_hir_symbol::Symbol,
op: midenc_hir_symbol::Symbol,
},
}
impl FromStr for IrFilter {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.split_once(':') {
Some(("symbol", "" | "*")) => Ok(Self::Symbol(None)),
Some(("symbol", pattern)) => Ok(Self::Symbol(Some(pattern.to_string().into()))),
Some(("op", name)) => match name.split_once(".") {
Some((dialect, op)) => Ok(Self::Op {
dialect: midenc_hir_symbol::Symbol::intern(dialect),
op: midenc_hir_symbol::Symbol::intern(op),
}),
None => Err(format!(
"invalid operation name '{name}': must be dialect-qualified, e.g. \
`dialect.{name}`"
)),
},
Some((ty, _)) => {
Err(format!("unrecognized filter type '{ty}': expected `symbol` or `op`"))
}
None if s == "any" => Ok(Self::Any),
None => Err(format!(
"unrecognized filter '{s}': expected `symbol:<pattern|*>`, \
`op:<dialect>.<opcode>`, or `any`"
)),
}
}
}