protobuf-parse 3.7.2

Parse `.proto` files. Files are parsed into a `protobuf::descriptor::FileDescriptorSet` object using either: * pure rust parser (no dependencies) * `protoc` binary (more reliable and compatible with Google's implementation)
Documentation
use protobuf::descriptor::FileDescriptorProto;

use crate::pure::convert::populate_dependencies;
use crate::pure::model;
use crate::pure::parser::ParserErrorWithLocation;

/// Parse imports from a `.proto` file.
///
/// The result is [`FileDescriptorProto`] object with only `*dependency` fields filled.
pub fn parse_dependencies(content: &str) -> Result<FileDescriptorProto, ParserErrorWithLocation> {
    let input = model::FileDescriptor::parse(content)?;
    let mut output = FileDescriptorProto::new();
    populate_dependencies(&input, &mut output);
    Ok(output)
}

#[cfg(test)]
mod test {
    #[test]
    fn parse_dependencies() {
        let deps = crate::pure::parse_dependencies::parse_dependencies(
            r"
syntax = 'proto3';

import 'google/protobuf/field_mask.proto';
import public 'google/protobuf/struct.proto';

message IgnoreMe {}
",
        )
        .unwrap();
        assert_eq!(
            &[
                "google/protobuf/field_mask.proto",
                "google/protobuf/struct.proto",
            ],
            &deps.dependency[..]
        );
        assert_eq!(&[1], &deps.public_dependency[..]);
    }
}