rusty-tesseract 1.1.10

A Rust wrapper for Google Tesseract
Documentation
use super::*;
use core::fmt;

#[derive(Debug, PartialEq)]
pub struct ConfigParameterOutput {
    pub output: String,
    pub config_parameters: Vec<ConfigParameter>,
}

impl fmt::Display for ConfigParameterOutput {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.output)
    }
}

#[derive(Debug, PartialEq)]
pub struct ConfigParameter {
    pub name: String,
    pub default_value: String,
    pub description: String,
}

impl fmt::Display for ConfigParameter {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "{} {} {}",
            self.name, self.default_value, self.description,
        )
    }
}

impl FromLine for ConfigParameter {
    fn from_line(line: &str) -> Option<Self> {
        let (name, x) = line.split_once("\t")?;
        let (default_value, description) = x.split_once("\t")?;

        Some(ConfigParameter {
            name: name.into(),
            default_value: default_value.into(),
            description: description.into(),
        })
    }
}

pub fn get_tesseract_config_parameters() -> TessResult<ConfigParameterOutput> {
    let mut command = get_tesseract_command();
    command.arg("--print-parameters");

    let output = run_tesseract_command(&mut command)?;

    let config_parameters = string_to_config_parameter_output(&output)?;

    Ok(ConfigParameterOutput {
        output,
        config_parameters,
    })
}

fn string_to_config_parameter_output(output: &str) -> TessResult<Vec<ConfigParameter>> {
    output
        .lines()
        .skip(1)
        .map(|line| ConfigParameter::parse(line))
        .collect::<_>()
}

#[cfg(test)]
mod tests {
    use crate::{output_config_parameters::string_to_config_parameter_output, *};

    #[test]
    fn test_string_to_config_parameter_output() {
        let result = string_to_config_parameter_output(
            "Tesseract parameters:\n\
        log_level\t2147483647\tLogging level\n\
        textord_dotmatrix_gap\t3\t pixel gap for broken pixed pitch\n\
        textord_debug_block\t0\tBlock to do debug on\n\
        textord_pitch_range\t2\tMax range test on pitch",
        )
        .unwrap();

        let expected = ConfigParameter {
            name: "log_level".into(),
            default_value: "2147483647".into(),
            description: "Logging level".into(),
        };

        assert_eq!(result.first().unwrap(), &expected);
    }

    #[test]
    fn test_get_tesseract_config_parameters() {
        let result = get_tesseract_config_parameters().unwrap();
        let x = result
            .config_parameters
            .iter()
            .find(|&x| x.name == "tessedit_char_whitelist")
            .unwrap();

        let expected = ConfigParameter {
            name: "tessedit_char_whitelist".into(),
            default_value: "".into(),
            description: "Whitelist of chars to recognize".into(),
        };

        assert_eq!(*x, expected);
    }

    #[test]
    fn test_string_to_config_parameter_output_parse_error() {
        let result = string_to_config_parameter_output(
            "Tesseract parameters:\n\
        log_level\t2147483647\tLogging level\n\
        Test\n\
        textord_debug_block\t0\tBlock to do debug on\n\
        textord_pitch_range\t2\tMax range test on pitch",
        );
        assert_eq!(
            result,
            Err(TessError::ParseError("invalid line 'Test'".into()))
        )
    }
}