odcs 0.6.0

Reference implementation of the Open Data Contract Standard (ODCS)
Documentation
//! YAML document parser.

use crate::diagnostics::codes;
use crate::model::DataContract;

use super::duplicate_keys::{find_yaml_duplicate_key, YamlDuplicateKeyScan};
use super::{failure_duplicate_key, failure_from_serde, success, ParseResult};

/// Parse YAML bytes into an ODCS contract.
#[must_use]
pub fn parse_yaml(content: &[u8]) -> ParseResult {
    let text = match std::str::from_utf8(content) {
        Ok(text) => text,
        Err(error) => return failure_from_serde(codes::PARSE_YAML, error),
    };

    match find_yaml_duplicate_key(text) {
        YamlDuplicateKeyScan::Duplicate(finding) => return failure_duplicate_key(finding),
        YamlDuplicateKeyScan::ScanFailed => {
            return failure_from_serde(
                codes::PARSE_YAML,
                "failed to scan YAML document for duplicate keys",
            );
        }
        YamlDuplicateKeyScan::Ok => {}
    }

    let de = serde_yaml::Deserializer::from_slice(content);
    match serde_path_to_error::deserialize::<_, DataContract>(de) {
        Ok(contract) => success(contract),
        Err(error) => failure_from_serde(codes::PARSE_YAML, error),
    }
}