diff --git a/src/ticket/document/reader.rs b/src/ticket/document/reader.rs index b93a4ac..a617a2d 100644 --- a/src/ticket/document/reader.rs +++ b/src/ticket/document/reader.rs @@ -108,12 +108,16 @@ impl PsfValueContext { match self.value_type.local_name.as_str() { "string" => return Ok(PropertyValue::String(self.value)), "integer" => { - return self.value.parse().map(PropertyValue::Integer).map_err(|_| { - ParsePrintSchemaError::InvalidPrintSchema { + // xsd:integer collapses whitespace: drivers may emit " 16900 ". + return self + .value + .trim() + .parse() + .map(PropertyValue::Integer) + .map_err(|_| ParsePrintSchemaError::InvalidPrintSchema { pos: self.pos, reason: "Invalid integer".to_string(), - } - }) + }); } "QName" => { return Ok(PropertyValue::QName(parse_qname( @@ -490,7 +494,7 @@ impl ParsableXmlDocument for PrintTicketDocument { mod tests { use super::{ParsableXmlDocument, ParsePrintSchemaError}; use crate::ticket::document::{ - PrintCapabilitiesDocument, PrintSchemaDocument, PrintTicketDocument, + PrintCapabilitiesDocument, PrintSchemaDocument, PrintTicketDocument, WithProperties, NS_PSF, }; #[test] @@ -579,4 +583,26 @@ mod tests { let xml = include_bytes!("../../../test_data/print_capabilities.xml"); let _document = PrintCapabilitiesDocument::parse_from_bytes(xml).unwrap(); } + + #[test] + fn integer_value_with_surrounding_whitespace() { + // Toshiba's "Universal Printer 2" driver pads some integers, e.g. " 16900 ". + let xml = r#" + + + 16900 + + +"#; + let document = PrintCapabilitiesDocument::parse_from_bytes(xml).unwrap(); + let max_value = document.parameter_defs[0] + .get_property("MaxValue", Some(NS_PSF)) + .and_then(|x| x.value.as_ref()) + .and_then(|x| x.integer()); + assert_eq!(max_value, Some(16900)); + } }