xberg-gliner 1.3.10

GLiNER inference used by xberg NER: span-mode ONNX runtime plus an optional Candle GLiNER2 backend.
Documentation
use regex::Regex;

use crate::{Result, Token};

pub(crate) const DEFAULT_SPLITTER_REGEX: &str = r"\w+(?:[-_]\w+)*|\S";

pub(crate) trait Splitter {
    fn split(&self, input: &str, limit: Option<usize>) -> Result<Vec<Token>>;
}

pub(crate) struct RegexSplitter {
    regex: Regex,
}

impl RegexSplitter {
    pub(crate) fn new(regex: &str) -> Result<Self> {
        Ok(Self {
            regex: Regex::new(regex)?,
        })
    }
}

impl Splitter for RegexSplitter {
    fn split(&self, input: &str, limit: Option<usize>) -> Result<Vec<Token>> {
        let mut result = Vec::new();
        for match_ in self.regex.find_iter(input) {
            result.push(Token::new(match_.start(), match_.end(), match_.as_str()));
            if limit.is_some_and(|limit| result.len() >= limit) {
                break;
            }
        }
        Ok(result)
    }
}