boring-parser 0.5.1

A Rust library for boring xml parsing
Documentation
use crate::boring_structs_110::Boring110;
use crate::boring_structs_200::Boring200;
use crate::boring_structs_210::Boring210;
use crate::boring_structs_300::Boring300;
use crate::boring_structs_400::Boring400;
use crate::error::ParseError;
use quick_xml::Reader;
use quick_xml::de::from_str;
use quick_xml::events::Event;
use quick_xml::se::to_string;
use std::str::{self};

pub trait Parse<T> {
    fn parse_from_str(xml_str: &str) -> Result<T, Box<dyn std::error::Error>>;
}

impl Parse<Boring110> for Boring110 {
    fn parse_from_str(xml_str: &str) -> Result<Boring110, Box<dyn std::error::Error>> {
        let boring: Boring110 = from_str(xml_str)?;
        Ok(boring)
    }
}

impl Parse<Boring200> for Boring200 {
    fn parse_from_str(xml_str: &str) -> Result<Boring200, Box<dyn std::error::Error>> {
        let boring: Boring200 = from_str(xml_str)?;
        Ok(boring)
    }
}

impl Parse<Boring210> for Boring210 {
    fn parse_from_str(xml_str: &str) -> Result<Boring210, Box<dyn std::error::Error>> {
        let boring: Boring210 = from_str(xml_str)?;
        Ok(boring)
    }
}

impl Parse<Boring300> for Boring300 {
    fn parse_from_str(xml_str: &str) -> Result<Boring300, Box<dyn std::error::Error>> {
        let boring: Boring300 = from_str(xml_str)?;
        Ok(boring)
    }
}

impl Parse<Boring400> for Boring400 {
    fn parse_from_str(xml_str: &str) -> Result<Boring400, Box<dyn std::error::Error>> {
        let boring: Boring400 = from_str(xml_str)?;
        Ok(boring)
    }
}

pub trait ToXml {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>>;
}

impl ToXml for Boring110 {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>> {
        let xml = to_string(&self)?;
        Ok(xml)
    }
}

impl ToXml for Boring200 {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>> {
        let xml = to_string(&self)?;
        Ok(xml)
    }
}

impl ToXml for Boring210 {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>> {
        let xml = to_string(&self)?;
        Ok(xml)
    }
}

impl ToXml for Boring300 {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>> {
        let xml = to_string(&self)?;
        Ok(xml)
    }
}

impl ToXml for Boring400 {
    fn to_xml_string(&self) -> Result<String, Box<dyn std::error::Error>> {
        let xml = to_string(&self)?;
        Ok(xml)
    }
}

pub fn extract_dtd_version(xml: &str) -> Result<String, ParseError> {
    let mut reader = Reader::from_str(xml);
    reader.trim_text(true);
    let mut buf = Vec::new();
    loop {
        match reader.read_event_into(&mut buf) {
            Ok(Event::Start(ref e)) if e.name().as_ref() == "ボーリング情報".as_bytes() => {
                for attr in e.attributes().flatten() {
                    if attr.key.as_ref() == b"DTD_version" {
                        return Ok(attr.unescape_value().unwrap_or_default().to_string());
                    }
                }
                break;
            }
            Ok(Event::Eof) => break,
            _ => {}
        }
        buf.clear();
    }
    Err(ParseError::ParseError(String::from(
        "DTD_version was not found. Plese check your XML file.",
    )))
}