use kbnf_syntax::regex::FiniteStateAutomatonConfig;
#[cfg(feature = "python")]
use pyo3::pyclass;
use serde::{Deserialize, Serialize};
use crate::engine::EngineConfig;
#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
#[derive(Debug, Clone)]
pub struct InternalConfig {
pub regex_config: FiniteStateAutomatonConfig,
pub compression_config: kbnf_syntax::config::CompressionConfig,
pub engine_config: EngineConfig,
pub start_nonterminal: String,
}
#[cfg_attr(feature = "python", pyclass)]
#[cfg_attr(feature = "python", pyo3(get_all, set_all))]
#[cfg_attr(feature = "wasm", wasm_bindgen(inspectable, getter_with_clone))]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct Config {
pub regex_config: RegexConfig,
pub engine_config: EngineConfig,
pub start_nonterminal: String,
pub expected_output_length: usize,
pub compression_config: CompressionConfig,
}
#[cfg_attr(feature = "python", pyclass(eq, eq_int))]
#[cfg_attr(feature = "wasm", wasm_bindgen)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Copy)]
pub enum Fsa {
Dfa,
}
#[cfg_attr(feature = "python", pyclass)]
#[cfg_attr(feature = "python", pyo3(get_all, set_all))]
#[cfg_attr(feature = "wasm", wasm_bindgen(inspectable))]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Copy)]
pub struct RegexConfig {
pub max_memory_usage: Option<usize>,
pub fsa_type: Fsa,
pub min_tokens_required_for_eager_regex_cache: Option<usize>,
}
#[cfg_attr(feature = "python", pyclass)]
#[cfg_attr(feature = "python", pyo3(get_all, set_all))]
#[cfg_attr(feature = "wasm", wasm_bindgen(inspectable))]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Copy)]
pub struct CompressionConfig {
pub min_terminals: usize,
}
impl Default for Config {
fn default() -> Self {
Self {
regex_config: RegexConfig {
max_memory_usage: None,
fsa_type: Fsa::Dfa,
min_tokens_required_for_eager_regex_cache: Some(1000),
},
engine_config: EngineConfig {
cache_enabled: true,
compaction_enabled: true,
rejected_token_prefix_cache_enabled: true,
},
start_nonterminal: "start".to_string(),
compression_config: CompressionConfig { min_terminals: 5 },
expected_output_length: u32::MAX as usize,
}
}
}
impl Config {
pub fn internal_config(self) -> InternalConfig {
let regex_config = match self.regex_config.fsa_type {
Fsa::Dfa => FiniteStateAutomatonConfig::Dfa(
kbnf_regex_automata::dfa::dense::Config::new()
.dfa_size_limit(self.regex_config.max_memory_usage)
.start_kind(kbnf_regex_automata::dfa::StartKind::Both),
),
};
let compression_config = kbnf_syntax::config::CompressionConfig {
min_terminals: self.compression_config.min_terminals,
regex_config: FiniteStateAutomatonConfig::Dfa(
kbnf_regex_automata::dfa::dense::Config::new(),
),
};
InternalConfig {
regex_config,
compression_config,
engine_config: self.engine_config,
start_nonterminal: self.start_nonterminal,
}
}
}