/* * This file is part of Datafu * Copyright (C) 2021 Soni L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ use std::borrow::Borrow; use std::collections::BTreeMap; use crate::PatternTypes; use crate::RefOwn; use crate::Predicate; use crate::errors::PatternError; use crate::parser::parse; use crate::vm::Matcher; use crate::vm::PatternConstants; use crate::vm::MAX_CALLS; pub struct Pattern { consts: PatternConstants, } impl Pattern { /// Compiles the input into a pattern. pub fn compile<'s, P, O>( input: &'s str, preds: Option>>>, objs: Option> ) -> Result> where P: Borrow + Ord, O: Borrow + Ord, { Ok(Self { consts: parse(input, preds, objs)? }) } pub fn attempt_match<'a, 'b>( &'a self, value: impl Into> ) -> Matcher<'a, 'b, T> { Matcher::new(value.into(), &self.consts, self.consts.protos.len() - 1, MAX_CALLS).ok().expect("datafu internal error: MAX_CALLS must not be 0") } }