use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RecursiveChunk {
pub text: String,
pub start_index: usize,
pub end_index: usize,
pub token_count: usize,
pub level: usize,
}
impl RecursiveChunk {
pub fn new(
text: String,
start_index: usize,
end_index: usize,
token_count: usize,
level: usize,
) -> Self {
RecursiveChunk {
text,
start_index,
end_index,
token_count,
level,
}
}
pub fn new_without_level(
text: String,
start_index: usize,
end_index: usize,
token_count: usize,
) -> Self {
RecursiveChunk {
text,
start_index,
end_index,
token_count,
level: 0,
}
}
}
impl fmt::Display for RecursiveChunk {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"RecursiveChunk(text: {}, start_index: {}, end_index: {}, token_count: {}, level: {})",
self.text, self.start_index, self.end_index, self.token_count, self.level
)
}
}
#[derive(Debug, Clone)]
pub struct RecursiveLevel {
pub delimiters: Vec<String>,
pub whitespace: bool,
}
impl RecursiveLevel {
pub fn new(delimiters: Vec<String>, whitespace: bool) -> Self {
RecursiveLevel {
delimiters,
whitespace,
}
}
}
impl Default for RecursiveLevel {
fn default() -> Self {
RecursiveLevel {
delimiters: Vec::new(),
whitespace: false,
}
}
}
#[derive(Debug, Clone)]
pub struct RecursiveRules {
pub levels: Vec<RecursiveLevel>,
}
impl RecursiveRules {
pub fn new(levels: Vec<RecursiveLevel>) -> Self {
RecursiveRules { levels }
}
}
impl Default for RecursiveRules {
fn default() -> Self {
let mut default_rules: Vec<RecursiveLevel> = Vec::new();
default_rules.push(RecursiveLevel::new(
vec!["\n\n".to_string(), "\n\r".to_string()],
false,
));
default_rules.push(RecursiveLevel::new(
vec![
".".to_string(),
"?".to_string(),
"!".to_string(),
"\n".to_string(),
"\r".to_string(),
],
true,
));
default_rules.push(RecursiveLevel::new(
vec![";".to_string(), ":".to_string()],
true,
));
default_rules.push(RecursiveLevel::new(vec![], true));
default_rules.push(RecursiveLevel::default());
RecursiveRules {
levels: default_rules,
}
}
}
impl fmt::Display for RecursiveRules {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "RecursiveRules(levels: {:?})", self.levels)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_recursive_rules() {
let rules = RecursiveRules::default();
assert_eq!(rules.levels.len(), 5);
}
}