pub mod xcsp3_core {
use regex::Regex;
use std::fmt::{Display, Formatter};
use std::str::FromStr;
#[derive(Clone, Debug)]
pub enum XVarVal {
IntVar(String),
IntVal(i32),
IntInterval(i32, i32),
IntArgument(i32),
IntStart,
IntNone,
}
impl Display for XVarVal {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
write!(
f,
"{}",
match self {
XVarVal::IntVar(v) => {
v.clone()
}
XVarVal::IntVal(v) => {
v.to_string()
}
XVarVal::IntInterval(l, r) => {
format!("{}..{}", l, r)
}
XVarVal::IntArgument(e) => {
format!("%{}", e)
}
XVarVal::IntStart => {
"%...".to_string()
}
XVarVal::IntNone => {
"".to_string()
}
}
)
}
}
impl XVarVal {
pub fn from_string(s: &str) -> Option<Self> {
if s.contains('[') {
Some(XVarVal::IntVar(String::from(s)))
} else if s.is_empty() {
None
} else if s.contains('%') {
if Regex::new(r"%(0|[1-9][0-9]*)").unwrap().is_match(s)
{
match i32::from_str(&s[1..]) {
Ok(e) => Some(XVarVal::IntArgument(e)),
Err(_) => None,
}
} else if Regex::new(r"%([.]*)").unwrap().is_match(s)
{
Some(XVarVal::IntStart)
} else {
None
}
} else {
match i32::from_str(s) {
Ok(e) => Some(XVarVal::IntVal(e)),
Err(_) => Some(XVarVal::IntVar(String::from(s))),
}
}
}
}
}