├── protox ├── LICENSE-MIT ├── LICENSE-APACHE ├── tests │ ├── data │ │ ├── empty_file.proto │ │ ├── option_merge_message.proto │ │ ├── empty_file_with_comment.proto │ │ ├── include │ │ │ ├── no_package.proto │ │ │ └── package.proto │ │ ├── custom_json_name.proto │ │ ├── generate_map_entry_message.proto │ │ ├── generate_group_message.proto │ │ ├── oneof_group_field.proto │ │ ├── generate_synthetic_oneof_ordering.proto │ │ ├── generate_synthetic_oneof.proto │ │ ├── package_name_field_name_conflict.proto │ │ ├── name_resolution_incorrect.proto │ │ ├── generated_message_ordering.proto │ │ ├── service.proto │ │ ├── multiple_extends.proto │ │ ├── message_name_field_name_conflict.proto │ │ ├── reserved_ranges.proto │ │ ├── option_group_field.proto │ │ ├── name_resolution.proto │ │ ├── google │ │ │ ├── unittest_preserve_unknown_enum2.proto │ │ │ └── unittest_preserve_unknown_enum.proto │ │ └── field_defaults.proto │ └── snapshots │ │ ├── compiler__import_error.snap │ │ ├── compiler__import_not_found.snap │ │ ├── compiler__type_not_found.snap │ │ ├── compiler__double_import_error.snap │ │ └── compiler__double_import_branch_error.snap ├── CHANGELOG.md └── src │ ├── file │ ├── google.rs │ └── chain.rs │ └── main.rs ├── protox-parse ├── LICENSE-MIT ├── LICENSE-APACHE ├── src │ ├── parse │ │ ├── snapshots │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-18.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-10.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-17.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-19.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-2.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-21.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-3.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-11.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-12.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-22.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-13.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-16.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-7.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-20.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-23.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-4.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-6.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-8.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-14.snap │ │ │ ├── protox_parse__parse__tests__parse_file-9.snap │ │ │ ├── protox_parse__parse__tests__parse_group-6.snap │ │ │ ├── protox_parse__parse__tests__parse_import-10.snap │ │ │ ├── protox_parse__parse__tests__parse_import-11.snap │ │ │ ├── protox_parse__parse__tests__parse_import-8.snap │ │ │ ├── protox_parse__parse__tests__parse_import-9.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-9.snap │ │ │ ├── protox_parse__parse__tests__parse_import-12.snap │ │ │ ├── protox_parse__parse__tests__parse_option-19.snap │ │ │ ├── protox_parse__parse__tests__parse_option-20.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-6.snap │ │ │ ├── protox_parse__parse__tests__parse_option-15.snap │ │ │ ├── protox_parse__parse__tests__parse_option-25.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-5.snap │ │ │ ├── protox_parse__parse__tests__parse_file-3.snap │ │ │ ├── protox_parse__parse__tests__parse_file-6.snap │ │ │ ├── protox_parse__parse__tests__parse_text_format_message-15.snap │ │ │ ├── protox_parse__parse__tests__parse_field-5.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-11.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-9.snap │ │ │ ├── protox_parse__parse__tests__parse_field-11.snap │ │ │ ├── protox_parse__parse__tests__parse_field-7.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-11.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-8.snap │ │ │ ├── protox_parse__parse__tests__parse_option-10.snap │ │ │ ├── protox_parse__parse__tests__parse_option-21.snap │ │ │ ├── protox_parse__parse__tests__parse_service-11.snap │ │ │ ├── protox_parse__parse__tests__parse_service-14.snap │ │ │ ├── protox_parse__parse__tests__parse_service-18.snap │ │ │ ├── protox_parse__tests__negative_ident_outside_default.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-8.snap │ │ │ ├── protox_parse__parse__tests__parse_field-12.snap │ │ │ ├── protox_parse__parse__tests__parse_field-14.snap │ │ │ ├── protox_parse__parse__tests__parse_field-6.snap │ │ │ ├── protox_parse__parse__tests__parse_field-9.snap │ │ │ ├── protox_parse__parse__tests__parse_file-11.snap │ │ │ ├── protox_parse__parse__tests__parse_group-10.snap │ │ │ ├── protox_parse__parse__tests__parse_group-9.snap │ │ │ ├── protox_parse__parse__tests__parse_import-7.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-10.snap │ │ │ ├── protox_parse__parse__tests__parse_option-7.snap │ │ │ ├── protox_parse__parse__tests__parse_option-9.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-12.snap │ │ │ ├── protox_parse__parse__tests__parse_extension-7.snap │ │ │ ├── protox_parse__parse__tests__parse_field-10.snap │ │ │ ├── protox_parse__parse__tests__parse_field-8.snap │ │ │ ├── protox_parse__parse__tests__parse_group-7.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-7.snap │ │ │ ├── protox_parse__parse__tests__parse_package-4.snap │ │ │ ├── protox_parse__parse__tests__parse_package-5.snap │ │ │ ├── protox_parse__parse__tests__parse_service-10.snap │ │ │ ├── protox_parse__parse__tests__parse_service-13.snap │ │ │ ├── protox_parse__parse__tests__parse_service-16.snap │ │ │ ├── protox_parse__parse__tests__parse_service-17.snap │ │ │ ├── protox_parse__parse__tests__parse_service-20.snap │ │ │ ├── protox_parse__parse__tests__parse_service-21.snap │ │ │ ├── protox_parse__parse__tests__parse_service-22.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-14.snap │ │ │ ├── protox_parse__parse__tests__parse_field-13.snap │ │ │ ├── protox_parse__parse__tests__parse_file-15.snap │ │ │ ├── protox_parse__parse__tests__parse_group-13.snap │ │ │ ├── protox_parse__parse__tests__parse_import-6.snap │ │ │ ├── protox_parse__parse__tests__parse_option-24.snap │ │ │ ├── protox_parse__parse__tests__parse_option-6.snap │ │ │ ├── protox_parse__parse__tests__parse_option-8.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-16.snap │ │ │ ├── protox_parse__parse__tests__parse_extension-8.snap │ │ │ ├── protox_parse__parse__tests__parse_message-18.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-7.snap │ │ │ ├── protox_parse__parse__tests__parse_service-15.snap │ │ │ ├── protox_parse__parse__tests__parse_service-19.snap │ │ │ ├── protox_parse__parse__tests__parse_service-23.snap │ │ │ ├── protox_parse__parse__tests__parse_field-17.snap │ │ │ ├── protox_parse__parse__tests__parse_message-17.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-9.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-5.snap │ │ │ ├── protox_parse__parse__tests__parse_import-5.snap │ │ │ ├── protox_parse__parse__tests__parse_message-16.snap │ │ │ ├── protox_parse__parse__tests__parse_message-19.snap │ │ │ ├── protox_parse__parse__tests__parse_message-20.snap │ │ │ ├── protox_parse__parse__tests__parse_option-23.snap │ │ │ ├── protox_parse__parse__tests__parse_service-12.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-10.snap │ │ │ ├── protox_parse__parse__tests__parse_file.snap │ │ │ ├── protox_parse__parse__tests__parse_file-14.snap │ │ │ ├── protox_parse__parse__tests__parse_group-11.snap │ │ │ ├── protox_parse__parse__tests__parse_message-11.snap │ │ │ ├── protox_parse__parse__tests__parse_group-8.snap │ │ │ ├── protox_parse__parse__tests__parse_file-16.snap │ │ │ ├── protox_parse__parse__tests__parse_file_error.snap │ │ │ ├── protox_parse__parse__tests__parse_group-12.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-8.snap │ │ │ ├── protox_parse__parse__tests__parse_import.snap │ │ │ ├── protox_parse__parse__tests__parse_file-18.snap │ │ │ ├── protox_parse__parse__tests__parse_import-13.snap │ │ │ ├── protox_parse__parse__tests__parse_file-17.snap │ │ │ ├── protox_parse__tests__parse_field_default.snap │ │ │ ├── protox_parse__parse__tests__parse_file-7.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-2.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof.snap │ │ │ ├── protox_parse__parse__tests__parse_service-2.snap │ │ │ ├── protox_parse__parse__tests__parse_service.snap │ │ │ ├── protox_parse__parse__tests__parse_service-4.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-2.snap │ │ │ ├── protox_parse__parse__tests__parse_enum.snap │ │ │ ├── protox_parse__parse__tests__parse_import-2.snap │ │ │ ├── protox_parse__parse__tests__parse_import-3.snap │ │ │ ├── protox_parse__parse__tests__parse_import-4.snap │ │ │ ├── protox_parse__parse__tests__parse_package.snap │ │ │ ├── protox_parse__parse__tests__parse_service-3.snap │ │ │ ├── protox_parse__parse__tests__parse_message.snap │ │ │ ├── protox_parse__parse__tests__parse_message-3.snap │ │ │ ├── protox_parse__parse__tests__parse_file-13.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-3.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-3.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-4.snap │ │ │ ├── protox_parse__parse__tests__parse_package-3.snap │ │ │ ├── protox_parse__parse__tests__parse_extension-3.snap │ │ │ ├── protox_parse__parse__tests__parse_extension.snap │ │ │ ├── protox_parse__parse__tests__parse_package-2.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-3.snap │ │ │ ├── protox_parse__parse__tests__parse_message-2.snap │ │ │ ├── protox_parse__parse__tests__parse_option-11.snap │ │ │ ├── protox_parse__parse__tests__parse_file-10.snap │ │ │ ├── protox_parse__parse__tests__parse_option-14.snap │ │ │ ├── protox_parse__parse__tests__parse_extension-2.snap │ │ │ ├── protox_parse__parse__tests__parse_option.snap │ │ │ ├── protox_parse__parse__tests__parse_option-17.snap │ │ │ ├── protox_parse__parse__tests__parse_option-16.snap │ │ │ ├── protox_parse__parse__tests__parse_field-2.snap │ │ │ ├── protox_parse__parse__tests__parse_group-2.snap │ │ │ ├── protox_parse__parse__tests__parse_group-3.snap │ │ │ ├── protox_parse__parse__tests__parse_option-2.snap │ │ │ ├── protox_parse__parse__tests__parse_file-5.snap │ │ │ ├── protox_parse__parse__tests__parse_file-2.snap │ │ │ ├── protox_parse__parse__tests__parse_group.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-4.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-13.snap │ │ │ ├── protox_parse__parse__tests__parse_field.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-4.snap │ │ │ ├── protox_parse__parse__tests__parse_option-12.snap │ │ │ ├── protox_parse__parse__tests__parse_option-13.snap │ │ │ ├── protox_parse__parse__tests__parse_option-3.snap │ │ │ ├── protox_parse__parse__tests__parse_file-12.snap │ │ │ ├── protox_parse__parse__tests__parse_option-4.snap │ │ │ ├── protox_parse__parse__tests__parse_field-4.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-6.snap │ │ │ ├── protox_parse__parse__tests__parse_service-26.snap │ │ │ ├── protox_parse__parse__tests__parse_reserved-2.snap │ │ │ ├── protox_parse__parse__tests__parse_option-18.snap │ │ │ ├── protox_parse__parse__tests__parse_file-4.snap │ │ │ ├── protox_parse__parse__tests__parse_field-15.snap │ │ │ ├── protox_parse__parse__tests__parse_option-22.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-5.snap │ │ │ ├── protox_parse__parse__tests__parse_extension-4.snap │ │ │ ├── protox_parse__parse__tests__parse_option-5.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-12.snap │ │ │ ├── protox_parse__parse__tests__parse_message-10.snap │ │ │ ├── protox_parse__parse__tests__parse_group-4.snap │ │ │ ├── protox_parse__parse__tests__parse_oneof-13.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-7.snap │ │ │ ├── protox_parse__parse__tests__parse_message-9.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-5.snap │ │ │ ├── protox_parse__parse__tests__parse_service-5.snap │ │ │ ├── protox_parse__parse__tests__parse_service-7.snap │ │ │ ├── protox_parse__parse__tests__parse_service-8.snap │ │ │ ├── protox_parse__parse__tests__parse_field-16.snap │ │ │ ├── protox_parse__parse__tests__parse_enum-6.snap │ │ │ ├── protox_parse__parse__tests__parse_service-24.snap │ │ │ ├── protox_parse__parse__tests__parse_message-13.snap │ │ │ ├── protox_parse__parse__tests__parse_service-6.snap │ │ │ ├── protox_parse__parse__tests__parse_group-5.snap │ │ │ └── protox_parse__parse__tests__parse_field-3.snap │ │ └── comments.rs │ ├── snapshots │ │ ├── protox_parse__tests__negative_ident_outside_default.snap │ │ ├── protox_parse__tests__parse_field_default.snap │ │ ├── protox_parse__tests__syntax.snap │ │ ├── protox_parse__tests__syntax-2.snap │ │ ├── protox_parse__tests__syntax-3.snap │ │ ├── protox_parse__tests__imports.snap │ │ ├── protox_parse__tests__imports-2.snap │ │ └── protox_parse__tests__imports-3.snap │ ├── case.rs │ └── generate │ │ └── lines.rs └── Cargo.toml ├── .gitignore ├── .gitmodules ├── Cargo.toml ├── .github ├── codecov.yml ├── dependabot.yml └── workflows │ ├── release.yml │ └── ci.yml ├── proptest-regressions └── parse │ └── lex.txt └── LICENSE-MIT /protox/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../LICENSE-MIT -------------------------------------------------------------------------------- /protox-parse/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../LICENSE-MIT -------------------------------------------------------------------------------- /protox/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../LICENSE-APACHE -------------------------------------------------------------------------------- /protox-parse/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../LICENSE-APACHE -------------------------------------------------------------------------------- /protox/tests/data/empty_file.proto: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | .cargo-ok 4 | -------------------------------------------------------------------------------- /protox/tests/data/option_merge_message.proto: -------------------------------------------------------------------------------- 1 | // TODO -------------------------------------------------------------------------------- /protox/tests/data/empty_file_with_comment.proto: -------------------------------------------------------------------------------- 1 | // comment 2 | -------------------------------------------------------------------------------- /protox/tests/data/include/no_package.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | message Bar {} -------------------------------------------------------------------------------- /protox/tests/data/include/package.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package foo; 4 | 5 | message Foo {} -------------------------------------------------------------------------------- /protox/tests/data/custom_json_name.proto: -------------------------------------------------------------------------------- 1 | message Foo { 2 | repeated uint64 foo = 1 [json_name = "BAR_quz"]; 3 | } -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "protobuf"] 2 | path = protox/tests/protobuf 3 | url = https://github.com/protocolbuffers/protobuf.git 4 | -------------------------------------------------------------------------------- /protox/tests/data/generate_map_entry_message.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | message Foo { 4 | map bar = 1; 5 | } -------------------------------------------------------------------------------- /protox/tests/data/generate_group_message.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Foo { 4 | // bar 5 | optional group Bar = 1 {}; 6 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = ["protox", "protox-parse"] 4 | 5 | [workspace.metadata.release] 6 | allow-branch = ["main"] 7 | consolidate-commits = false 8 | -------------------------------------------------------------------------------- /protox/tests/data/oneof_group_field.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Message { 4 | oneof oneof { 5 | group Group = 1 { 6 | optional int32 bar = 1; 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /protox/tests/data/generate_synthetic_oneof_ordering.proto: -------------------------------------------------------------------------------- 1 | syntax = 'proto3'; 2 | 3 | message Foo { 4 | oneof o1 { 5 | float a = 1; 6 | } 7 | 8 | optional bool o3 = 2; 9 | 10 | oneof o2 { 11 | string b = 3; 12 | } 13 | } -------------------------------------------------------------------------------- /protox/tests/data/generate_synthetic_oneof.proto: -------------------------------------------------------------------------------- 1 | syntax = 'proto3'; 2 | 3 | message Foo { 4 | optional fixed64 val = 1; 5 | } 6 | 7 | message Bar { 8 | optional sfixed64 _val = 1; 9 | } 10 | 11 | message Quz { 12 | optional Bar val = 1; 13 | } 14 | -------------------------------------------------------------------------------- /protox/tests/data/package_name_field_name_conflict.proto: -------------------------------------------------------------------------------- 1 | // Regression test for https://github.com/andrewhickman/protox/issues/86 2 | syntax = "proto3"; 3 | 4 | package sample; 5 | 6 | import "include/package.proto"; 7 | 8 | message Sample { 9 | foo.Foo foo = 2; 10 | } -------------------------------------------------------------------------------- /protox/tests/data/name_resolution_incorrect.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "include/package.proto"; 4 | 5 | package com.foo.bar; 6 | 7 | 8 | message Names { 9 | .foo.Foo field5 = 5; // correct 10 | foo.Foo field6 = 6; // incorrect: not found in com.foo 11 | } 12 | -------------------------------------------------------------------------------- /protox/tests/snapshots/compiler__import_error.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox/tests/compiler.rs 3 | expression: "check_err(&[(\"root.proto\", \"import 'customerror.proto';\")])" 4 | --- 5 | causes: [] 6 | labels: [] 7 | message: failed to load file! 8 | related: [] 9 | severity: error 10 | 11 | -------------------------------------------------------------------------------- /protox/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-18.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : 10", 7 | ) 8 | -------------------------------------------------------------------------------- /.github/codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | require_ci_to_pass: yes 3 | 4 | coverage: 5 | precision: 2 6 | round: down 7 | range: "78...100" 8 | status: 9 | project: 10 | default: 11 | target: auto 12 | informational: true 13 | patch: 14 | default: 15 | target: auto 16 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : enum", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : -", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-19.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : {", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : 10.0", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-21.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : <", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : 1.0", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : [ enum ]", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : - enum", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-22.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value \"foo\"", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : [ - enum ]", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : - \"string\"", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "[ ext . scalar ] : 10", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__negative_ident_outside_default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"\n option opt = -foo;\n \")" 4 | --- 5 | Err( 6 | [ 7 | NegativeIdentOutsideDefault { 8 | span: 22..26, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox/tests/data/generated_message_ordering.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | extend Bar { 4 | optional group Baz = 1 {} 5 | } 6 | 7 | message Bar { 8 | extensions 1; 9 | 10 | map x = 5; 11 | 12 | oneof foo { // foo 13 | group Quz = 3 {} 14 | } 15 | 16 | message Nest {} 17 | } -------------------------------------------------------------------------------- /protox/tests/data/service.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | message Foo {} 4 | 5 | service Service { 6 | rpc unary(Foo) returns (Foo); 7 | rpc client_streaming(stream Foo) returns (Foo); 8 | rpc server_streaming(Foo) returns (stream Foo); 9 | rpc streaming(stream Foo) returns (stream Foo); 10 | } 11 | 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-20.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : { } foo : 10.0", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-23.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "value : 1 value : 2 value : 3", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "foo : \"bar\" \"baz\" \"quz\"", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "message : { foo : \"bar\" }", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "[ ext . message ] : { foo : \"bar\" }", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "pot < kind : TULIP name : \"Bob\" legs : 0 >", 7 | ) 8 | -------------------------------------------------------------------------------- /protox/tests/data/multiple_extends.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Foo { 4 | extensions 1, 2 to 3; 5 | } 6 | 7 | // Foo1 8 | extend Foo { 9 | // Foo1.a 10 | optional int32 a = 1; 11 | } 12 | 13 | // Foo2 14 | extend Foo { 15 | // Foo2.b 16 | optional int32 b = 2; 17 | // Foo2.c 18 | optional int32 c = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_file() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedEof { 8 | expected: "';'", 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidGroupName { 8 | span: 15..16, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidImport { 8 | span: 7..18, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidImport { 8 | span: 7..19, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidImport { 8 | span: 7..17, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidImport { 8 | span: 7..17, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "any : { [ type . googleapis . com / foo . bar ] : { foo : \"bar\" } }", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidUtf8String { 8 | span: 7..13, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-19.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedEof { 8 | expected: "'}'", 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-20.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedEof { 8 | expected: "'}'", 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidIdentifier { 8 | span: 9..15, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-15.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | FloatSuffixOutsideTextFormat { 8 | span: 13..15, 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-25.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedEof { 8 | expected: "'}'", 9 | }, 10 | ], 11 | ) 12 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "s : \"first\" \"second\" \"third\" joined : \"first\" \"second\" \"third\" \"fourth\"", 7 | ) 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | DuplicatePackage { 8 | first: 0..19, 9 | second: 28..48, 10 | }, 11 | ], 12 | ) 13 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnknownSyntax { 8 | syntax: "unknown", 9 | span: 9..18, 10 | }, 11 | ], 12 | ) 13 | -------------------------------------------------------------------------------- /protox/tests/data/message_name_field_name_conflict.proto: -------------------------------------------------------------------------------- 1 | // Regression test for https://github.com/andrewhickman/protox/issues/57 2 | syntax = "proto3"; 3 | 4 | message Parent { 5 | ChildMessage ChildMessage = 1; 6 | ChildEnum ChildEnum = 2; 7 | } 8 | 9 | message ChildMessage { 10 | string field = 1; 11 | } 12 | 13 | enum ChildEnum { 14 | UNKNOWN = 0; 15 | A = 1; 16 | B = 2; 17 | } -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_text_format_message-15.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | "escapes : \"\\x07\\x08\\x0c\\n\\r\\t\\x0b?\\\\\\'\\\"\\x01\\tI\\n\\xaa\\xe1\\x84\\x91\\xf4\\x81\\x84\\x91\"", 7 | ) 8 | -------------------------------------------------------------------------------- /protox/tests/snapshots/compiler__import_not_found.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox/tests/compiler.rs 3 | expression: "check_err(&[(\"root.proto\", \"import 'notfound.proto';\")])" 4 | --- 5 | causes: [] 6 | filename: root.proto 7 | labels: 8 | - label: imported here 9 | span: 10 | length: 24 11 | offset: 0 12 | message: "import 'notfound.proto' not found" 13 | related: [] 14 | severity: error 15 | 16 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 2 | version: 2 3 | updates: 4 | - package-ecosystem: cargo 5 | directory: / 6 | schedule: 7 | interval: weekly 8 | groups: 9 | production-dependencies: 10 | dependency-type: production 11 | development-dependencies: 12 | dependency-type: development 13 | -------------------------------------------------------------------------------- /protox/tests/data/reserved_ranges.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Message { 4 | optional int32 field = 2; 5 | 6 | // name 7 | reserved "foo"; 8 | // reserved 9 | reserved 1, 3 to 4; 10 | // extensions 11 | extensions 5 to max; 12 | } 13 | 14 | enum Enum { 15 | ZERO = 0; 16 | 17 | // name 18 | reserved "ONE"; 19 | // reserved 20 | reserved 1, 2 to 3, 4 to max; 21 | } 22 | -------------------------------------------------------------------------------- /proptest-regressions/parse/lex.txt: -------------------------------------------------------------------------------- 1 | # Seeds for failure cases proptest has generated in the past. It is 2 | # automatically read and these particular cases re-run before any 3 | # novel cases are generated. 4 | # 5 | # It is recommended to check this file in to source control so that 6 | # everyone who runs the test benefits from these saved cases. 7 | cc 56eb0595089dc83031edf293118d9d8f9559e7ea7057d465bc5e27b60a32ebd2 # shrinks to s = "08¡" 8 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'<'", 9 | found: ">", 10 | span: 3..4, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__parse_field_default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"\n message Foo {\n optional int32 enum = 1 [default = 2.4];\n }\n \")" 4 | --- 5 | Err( 6 | [ 7 | ValueInvalidType { 8 | expected: "an integer", 9 | actual: "2.4", 10 | span: 70..73, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'='", 9 | found: ".", 10 | span: 15..16, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'{'", 9 | found: "0.1", 10 | span: 9..12, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'='", 9 | found: "]", 10 | span: 21..22, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "','", 9 | found: "(", 10 | span: 9..10, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'='", 9 | found: "{", 10 | span: 22..23, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'{'", 9 | found: "<", 10 | span: 10..11, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';'", 9 | found: ")", 10 | span: 15..16, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-21.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';'", 9 | found: ".", 10 | span: 28..29, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'{'", 9 | found: "(", 10 | span: 12..13, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'('", 9 | found: "{", 10 | span: 21..22, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-18.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'('", 9 | found: "=", 10 | span: 33..34, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__tests__negative_ident_outside_default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"\n option opt = -foo;\n \")" 4 | --- 5 | Err( 6 | ParseError { 7 | kind: NegativeIdentOutsideDefault { 8 | span: 22..26, 9 | }, 10 | related: [], 11 | source_code: "\n option opt = -foo;\n ", 12 | }, 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "3", 10 | span: 5..6, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an integer", 9 | found: "x", 10 | span: 23..24, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or ','", 9 | found: ";", 10 | span: 7..8, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a field type", 9 | found: ";", 10 | span: 4..5, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or '>'", 9 | found: ",", 10 | span: 16..17, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a constant", 9 | found: "/", 10 | span: 17..18, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'{' or '['", 9 | found: ";", 10 | span: 21..22, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an integer", 9 | found: "{", 10 | span: 19..20, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';'", 9 | found: "message", 10 | span: 13..20, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';' or '['", 9 | found: "}", 10 | span: 24..25, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'=' or '.'", 9 | found: "(", 10 | span: 11..12, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a constant", 9 | found: "=", 10 | span: 13..14, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an integer", 9 | found: "foo", 10 | span: 17..20, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a type name", 9 | found: "]", 10 | span: 7..8, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: ";", 10 | span: 17..18, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a field type", 9 | found: "=", 10 | span: 12..13, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: ",", 10 | span: 15..16, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "10.4", 10 | span: 6..10, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_package-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "=", 10 | span: 8..9, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_package-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or ';'", 9 | found: ")", 10 | span: 11..12, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: ";", 10 | span: 8..9, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "=", 10 | span: 18..19, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or ')'", 9 | found: "(", 10 | span: 23..24, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'returns'", 9 | found: "[", 10 | span: 25..26, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-20.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a type name", 9 | found: "=", 10 | span: 41..42, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-21.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or ')'", 9 | found: "}", 10 | span: 42..43, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-22.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';' or '{'", 9 | found: ")", 10 | span: 44..45, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "\"Foo\"", 10 | span: 5..10, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';' or '['", 9 | found: "service", 10 | span: 25..32, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-15.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a string", 9 | found: "1", 10 | span: 9..10, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a field type", 9 | found: "\"group\"", 10 | span: 9..16, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a string literal", 9 | found: ";", 10 | span: 14..15, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-24.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';'", 9 | found: "}", 10 | span: 17..18, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier or '('", 9 | found: ";", 10 | span: 7..8, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier or '('", 9 | found: "]", 10 | span: 11..12, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "';' or '['", 9 | found: "}", 10 | span: 19..20, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a type name", 9 | found: "{", 10 | span: 7..8, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-18.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "',' or ';'", 9 | found: "}", 10 | span: 27..28, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidUtf8String { 8 | span: 9..15, 9 | }, 10 | InvalidIdentifier { 11 | span: 9..15, 12 | }, 13 | ], 14 | ) 15 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-15.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'stream' or a type name", 9 | found: "+", 10 | span: 22..23, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-19.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'stream' or a type name", 9 | found: ")", 10 | span: 34..35, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-23.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'option', '}' or ';'", 9 | found: "rpc", 10 | span: 45..48, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a message field", 9 | found: "{", 10 | span: 0..1, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "',', ';' or '['", 9 | found: "}", 10 | span: 32..33, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a message field, option or '}'", 9 | found: ",", 10 | span: 12..13, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a positive integer or string", 9 | found: ";", 10 | span: 9..10, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a string literal, 'public' or 'weak'", 9 | found: ";", 10 | span: 7..8, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'to', ',' or ';'", 9 | found: "}", 10 | span: 27..28, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-19.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an integer or 'max'", 9 | found: "}", 10 | span: 30..31, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-20.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'.' or an identifier", 9 | found: ",", 10 | span: 27..28, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-23.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a numeric literal", 9 | found: "\"a\"", 10 | span: 14..17, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'rpc', '}', 'option' or ';'", 9 | found: "bar", 10 | span: 14..17, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier, '}', 'reserved' or 'option'", 9 | found: "]", 10 | span: 10..11, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_file() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..0, 8 | syntax: Proto2, 9 | syntax_span: None, 10 | package: None, 11 | imports: [], 12 | options: [], 13 | items: [], 14 | }, 15 | ) 16 | -------------------------------------------------------------------------------- /protox/tests/snapshots/compiler__type_not_found.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox/tests/compiler.rs 3 | expression: "check_err(&[(\"root.proto\",\n \"\n message Foo {\n optional NotFound foo = 1;\n }\n \")])" 4 | --- 5 | causes: [] 6 | filename: root.proto 7 | labels: 8 | - label: found here 9 | span: 10 | length: 8 11 | offset: 44 12 | message: "name 'NotFound' is not defined" 13 | related: [] 14 | severity: error 15 | 16 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..1, 8 | syntax: Proto2, 9 | syntax_span: None, 10 | package: None, 11 | imports: [], 12 | options: [], 13 | items: [], 14 | }, 15 | ) 16 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a message field, oneof, reserved range, enum, message, option or '}'", 9 | found: "]", 10 | span: 22..23, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a message field, oneof, reserved range, enum, message, option or '}'", 9 | found: ",", 10 | span: 14..15, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | InvalidGroupName { 8 | span: 15..16, 9 | }, 10 | UnexpectedToken { 11 | expected: "'='", 12 | found: "[", 13 | span: 17..18, 14 | }, 15 | ], 16 | ) 17 | -------------------------------------------------------------------------------- /protox/tests/snapshots/compiler__double_import_error.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox/tests/compiler.rs 3 | assertion_line: 79 4 | expression: "check_err(&[(\"existing.proto\", \"\"),\n(\"root.proto\",\n\"import 'existing.proto';\n import 'existing.proto';\n \"),])" 5 | --- 6 | causes: [] 7 | filename: root.proto 8 | labels: 9 | - label: imported here 10 | span: 11 | length: 24 12 | offset: 33 13 | message: "import 'existing.proto' was listed twice" 14 | related: [] 15 | severity: error 16 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'enum', 'extend', 'import', 'message', 'option', 'service', 'package' or ';'", 9 | found: "thing", 10 | span: 0..5, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file_error.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'enum', 'extend', 'import', 'message', 'option', 'service', 'package' or ';'", 9 | found: "thing", 10 | span: 0..5, 11 | }, 12 | ], 13 | ) 14 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | FloatSuffixOutsideTextFormat { 8 | span: 19..21, 9 | }, 10 | UnexpectedToken { 11 | expected: "an integer", 12 | found: "1.0", 13 | span: 19..21, 14 | }, 15 | ], 16 | ) 17 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | FloatSuffixOutsideTextFormat { 8 | span: 10..12, 9 | }, 10 | UnexpectedToken { 11 | expected: "an integer", 12 | found: "1.0", 13 | span: 10..12, 14 | }, 15 | ], 16 | ) 17 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Import { 7 | kind: None, 8 | value: "foo", 9 | value_span: 7..12, 10 | comments: Comments { 11 | leading_detached_comments: [], 12 | leading_comment: None, 13 | trailing_comment: None, 14 | }, 15 | span: 0..13, 16 | }, 17 | ) 18 | -------------------------------------------------------------------------------- /protox/tests/snapshots/compiler__double_import_branch_error.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox/tests/compiler.rs 3 | assertion_line: 91 4 | expression: "check_err(&[(\"existing.proto\", \"\"),\n(\"branch.proto\",\n\"import 'existing.proto';\n import 'existing.proto';\n \"),\n(\"root.proto\", \"import 'branch.proto';\n \"),])" 5 | --- 6 | causes: [] 7 | filename: branch.proto 8 | labels: 9 | - label: imported here 10 | span: 11 | length: 24 12 | offset: 33 13 | message: "import 'existing.proto' was listed twice" 14 | related: [] 15 | severity: error 16 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-18.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "'enum', 'extend', 'import', 'message', 'option', 'service', 'package' or ';'", 9 | found: "thing", 10 | span: 0..5, 11 | }, 12 | InvalidToken { 13 | span: 6..7, 14 | }, 15 | ], 16 | ) 17 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Import { 7 | kind: None, 8 | value: "foobar", 9 | value_span: 7..18, 10 | comments: Comments { 11 | leading_detached_comments: [], 12 | leading_comment: None, 13 | trailing_comment: None, 14 | }, 15 | span: 0..19, 16 | }, 17 | ) 18 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "an identifier", 9 | found: "}", 10 | span: 8..9, 11 | }, 12 | UnexpectedToken { 13 | expected: "an identifier", 14 | found: "}", 15 | span: 22..23, 16 | }, 17 | ], 18 | ) 19 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__tests__parse_field_default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"\n message Foo {\n optional int32 enum = 1 [default = 2.4];\n }\n \")" 4 | --- 5 | Err( 6 | ParseError { 7 | kind: ValueInvalidType { 8 | expected: "an integer", 9 | actual: "2.4", 10 | span: 70..73, 11 | }, 12 | related: [], 13 | source_code: "\n message Foo {\n optional int32 enum = 1 [default = 2.4];\n }\n ", 14 | }, 15 | ) 16 | -------------------------------------------------------------------------------- /protox/tests/data/option_group_field.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | import "google/protobuf/descriptor.proto"; 4 | 5 | message Composite { 6 | optional string str = 1001; 7 | optional group CompositeGroup = 1006 { 8 | required int32 grouped_int32 = 1; 9 | optional string grouped_str = 2; 10 | } 11 | } 12 | 13 | extend google.protobuf.MessageOptions { 14 | optional Composite compo = 30000; 15 | } 16 | 17 | message Message { 18 | option (compo) = { 19 | str: "a string" 20 | CompositeGroup: { 21 | grouped_int32: 1 22 | grouped_str: "hello" 23 | } 24 | }; 25 | } -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Err( 6 | [ 7 | UnexpectedToken { 8 | expected: "a message field, oneof, reserved range, enum, message, option or '}'", 9 | found: ",", 10 | span: 42..43, 11 | }, 12 | UnexpectedToken { 13 | expected: "'=' or '.'", 14 | found: "1", 15 | span: 88..89, 16 | }, 17 | ], 18 | ) 19 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_oneof() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [], 13 | comments: Comments { 14 | leading_detached_comments: [], 15 | leading_comment: None, 16 | trailing_comment: None, 17 | }, 18 | span: 0..17, 19 | }, 20 | ) 21 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_oneof() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [], 13 | comments: Comments { 14 | leading_detached_comments: [], 15 | leading_comment: None, 16 | trailing_comment: None, 17 | }, 18 | span: 0..12, 19 | }, 20 | ) 21 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [], 13 | comments: Comments { 14 | leading_detached_comments: [], 15 | leading_comment: None, 16 | trailing_comment: None, 17 | }, 18 | span: 0..19, 19 | }, 20 | ) 21 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [], 13 | comments: Comments { 14 | leading_detached_comments: [], 15 | leading_comment: None, 16 | trailing_comment: None, 17 | }, 18 | span: 0..14, 19 | }, 20 | ) 21 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "service", 9 | span: 8..15, 10 | }, 11 | options: [], 12 | methods: [], 13 | comments: Comments { 14 | leading_detached_comments: [], 15 | leading_comment: None, 16 | trailing_comment: None, 17 | }, 18 | span: 0..19, 19 | }, 20 | ) 21 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_enum() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [], 13 | reserved: [], 14 | comments: Comments { 15 | leading_detached_comments: [], 16 | leading_comment: None, 17 | trailing_comment: None, 18 | }, 19 | span: 0..16, 20 | }, 21 | ) 22 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_enum() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [], 13 | reserved: [], 14 | comments: Comments { 15 | leading_detached_comments: [], 16 | leading_comment: None, 17 | trailing_comment: None, 18 | }, 19 | span: 0..11, 20 | }, 21 | ) 22 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Import { 7 | kind: None, 8 | value: "foo", 9 | value_span: 19..24, 10 | comments: Comments { 11 | leading_detached_comments: [], 12 | leading_comment: Some( 13 | "leading", 14 | ), 15 | trailing_comment: Some( 16 | "trailing", 17 | ), 18 | }, 19 | span: 12..25, 20 | }, 21 | ) 22 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Import { 7 | kind: Some( 8 | ( 9 | Weak, 10 | 7..11, 11 | ), 12 | ), 13 | value: "foo", 14 | value_span: 12..17, 15 | comments: Comments { 16 | leading_detached_comments: [], 17 | leading_comment: None, 18 | trailing_comment: None, 19 | }, 20 | span: 0..18, 21 | }, 22 | ) 23 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_import-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Import { 7 | kind: Some( 8 | ( 9 | Public, 10 | 7..13, 11 | ), 12 | ), 13 | value: "foo", 14 | value_span: 14..22, 15 | comments: Comments { 16 | leading_detached_comments: [], 17 | leading_comment: None, 18 | trailing_comment: None, 19 | }, 20 | span: 0..23, 21 | }, 22 | ) 23 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_package.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_package() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Package { 7 | name: FullIdent { 8 | parts: [ 9 | Ident { 10 | value: "foo", 11 | span: 8..11, 12 | }, 13 | ], 14 | }, 15 | comments: Comments { 16 | leading_detached_comments: [], 17 | leading_comment: None, 18 | trailing_comment: None, 19 | }, 20 | span: 0..12, 21 | }, 22 | ) 23 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 30..33, 10 | }, 11 | options: [], 12 | methods: [], 13 | comments: Comments { 14 | leading_detached_comments: [ 15 | "detached\n", 16 | ], 17 | leading_comment: Some( 18 | "leading\n", 19 | ), 20 | trailing_comment: None, 21 | }, 22 | span: 22..58, 23 | }, 24 | ) 25 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_message() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | body: MessageBody { 12 | items: [], 13 | extensions: [], 14 | options: [], 15 | reserved: [], 16 | }, 17 | comments: Comments { 18 | leading_detached_comments: [], 19 | leading_comment: None, 20 | trailing_comment: None, 21 | }, 22 | span: 0..14, 23 | }, 24 | ) 25 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_message() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | body: MessageBody { 12 | items: [], 13 | extensions: [], 14 | options: [], 15 | reserved: [], 16 | }, 17 | comments: Comments { 18 | leading_detached_comments: [], 19 | leading_comment: None, 20 | trailing_comment: None, 21 | }, 22 | span: 0..19, 23 | }, 24 | ) 25 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..24, 8 | syntax: Proto3, 9 | syntax_span: Some( 10 | ( 11 | 0..24, 12 | Comments { 13 | leading_detached_comments: [], 14 | leading_comment: None, 15 | trailing_comment: None, 16 | }, 17 | ), 18 | ), 19 | package: None, 20 | imports: [], 21 | options: [], 22 | items: [], 23 | }, 24 | ) 25 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 42..45, 10 | }, 11 | options: [], 12 | fields: [], 13 | comments: Comments { 14 | leading_detached_comments: [ 15 | "detached1", 16 | "detached2\n", 17 | ], 18 | leading_comment: Some( 19 | "leading\n", 20 | ), 21 | trailing_comment: None, 22 | }, 23 | span: 36..65, 24 | }, 25 | ) 26 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_reserved() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Reserved { 7 | kind: Names( 8 | [ 9 | Ident { 10 | value: "foo", 11 | span: 21..26, 12 | }, 13 | ], 14 | ), 15 | comments: Comments { 16 | leading_detached_comments: [ 17 | "detached\n", 18 | ], 19 | leading_comment: None, 20 | trailing_comment: Some( 21 | "trailing", 22 | ), 23 | }, 24 | span: 12..27, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_enum() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 29..32, 10 | }, 11 | options: [], 12 | values: [], 13 | reserved: [], 14 | comments: Comments { 15 | leading_detached_comments: [ 16 | "detached", 17 | ], 18 | leading_comment: Some( 19 | "leading", 20 | ), 21 | trailing_comment: Some( 22 | "trailing\n", 23 | ), 24 | }, 25 | span: 24..52, 26 | }, 27 | ) 28 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_reserved() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Reserved { 7 | kind: Names( 8 | [ 9 | Ident { 10 | value: "foo", 11 | span: 9..14, 12 | }, 13 | Ident { 14 | value: "bar", 15 | span: 16..21, 16 | }, 17 | ], 18 | ), 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: None, 22 | trailing_comment: None, 23 | }, 24 | span: 0..22, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_package-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_package() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Package { 7 | name: FullIdent { 8 | parts: [ 9 | Ident { 10 | value: "foo", 11 | span: 8..11, 12 | }, 13 | Ident { 14 | value: "bar", 15 | span: 12..15, 16 | }, 17 | ], 18 | }, 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: None, 22 | trailing_comment: None, 23 | }, 24 | span: 0..16, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox/tests/data/name_resolution.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | import "include/package.proto"; 4 | import "include/no_package.proto"; 5 | 6 | package foo.bar; 7 | 8 | message FooBar {} 9 | 10 | message Names { 11 | .foo.bar.FooBar field1 = 1; 12 | foo.bar.FooBar field2 = 2; 13 | bar.FooBar field3 = 3; 14 | FooBar field4 = 4; 15 | 16 | .foo.Foo field5 = 5; 17 | foo.Foo field6 = 6; 18 | Foo field7 = 7; 19 | 20 | .Bar field8 = 8; 21 | Bar field9 = 9; 22 | 23 | message Nested { 24 | .foo.bar.FooBar field1 = 1; 25 | foo.bar.FooBar field2 = 2; 26 | bar.FooBar field3 = 3; 27 | FooBar field4 = 4; 28 | 29 | .foo.Foo field5 = 5; 30 | foo.Foo field6 = 6; 31 | Foo field7 = 7; 32 | 33 | .Bar field8 = 8; 34 | Bar field9 = 9; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_extend() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Extend { 7 | extendee: TypeName { 8 | leading_dot: None, 9 | name: FullIdent { 10 | parts: [ 11 | Ident { 12 | value: "Foo", 13 | span: 7..10, 14 | }, 15 | ], 16 | }, 17 | }, 18 | fields: [], 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: None, 22 | trailing_comment: None, 23 | }, 24 | span: 0..18, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_extend() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Extend { 7 | extendee: TypeName { 8 | leading_dot: None, 9 | name: FullIdent { 10 | parts: [ 11 | Ident { 12 | value: "Foo", 13 | span: 7..10, 14 | }, 15 | ], 16 | }, 17 | }, 18 | fields: [], 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: None, 22 | trailing_comment: None, 23 | }, 24 | span: 0..14, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_package-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_package() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Package { 7 | name: FullIdent { 8 | parts: [ 9 | Ident { 10 | value: "foo", 11 | span: 45..48, 12 | }, 13 | ], 14 | }, 15 | comments: Comments { 16 | leading_detached_comments: [ 17 | "detached\ndetached2\n", 18 | "detached3\n", 19 | ], 20 | leading_comment: None, 21 | trailing_comment: Some( 22 | "trailing", 23 | ), 24 | }, 25 | span: 37..49, 26 | }, 27 | ) 28 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_reserved() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Reserved { 7 | kind: Ranges( 8 | [ 9 | ReservedRange { 10 | start: Int { 11 | negative: true, 12 | value: 1, 13 | span: 9..11, 14 | }, 15 | end: None, 16 | }, 17 | ], 18 | ), 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: None, 22 | trailing_comment: None, 23 | }, 24 | span: 0..12, 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 30..33, 10 | }, 11 | body: MessageBody { 12 | items: [], 13 | extensions: [], 14 | options: [], 15 | reserved: [], 16 | }, 17 | comments: Comments { 18 | leading_detached_comments: [ 19 | "detached\n", 20 | ], 21 | leading_comment: Some( 22 | "leading", 23 | ), 24 | trailing_comment: None, 25 | }, 26 | span: 22..48, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-11.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "foo", 12 | span: 7..10, 13 | }, 14 | ), 15 | ], 16 | value: Aggregate( 17 | "", 18 | 13..15, 19 | ), 20 | }, 21 | comments: Comments { 22 | leading_detached_comments: [], 23 | leading_comment: None, 24 | trailing_comment: None, 25 | }, 26 | span: 0..16, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 35..53, 8 | syntax: Proto3, 9 | syntax_span: Some( 10 | ( 11 | 35..53, 12 | Comments { 13 | leading_detached_comments: [ 14 | " leading detached ", 15 | ], 16 | leading_comment: Some( 17 | " leading\n", 18 | ), 19 | trailing_comment: None, 20 | }, 21 | ), 22 | ), 23 | package: None, 24 | imports: [], 25 | options: [], 26 | items: [], 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "baz", 12 | span: 7..10, 13 | }, 14 | ), 15 | ], 16 | value: Aggregate( 17 | "foo : [ < x : 3 > , < y { } ; z < a : - foo > , > ]", 18 | 13..47, 19 | ), 20 | }, 21 | comments: Comments { 22 | leading_detached_comments: [], 23 | leading_comment: None, 24 | trailing_comment: None, 25 | }, 26 | span: 0..48, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_extend() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Extend { 7 | extendee: TypeName { 8 | leading_dot: None, 9 | name: FullIdent { 10 | parts: [ 11 | Ident { 12 | value: "Foo", 13 | span: 18..21, 14 | }, 15 | ], 16 | }, 17 | }, 18 | fields: [], 19 | comments: Comments { 20 | leading_detached_comments: [], 21 | leading_comment: Some( 22 | "leading", 23 | ), 24 | trailing_comment: Some( 25 | "trailing\n", 26 | ), 27 | }, 28 | span: 11..37, 29 | }, 30 | ) 31 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "foo", 12 | span: 7..10, 13 | }, 14 | ), 15 | ], 16 | value: Int( 17 | Int { 18 | negative: false, 19 | value: 5, 20 | span: 13..14, 21 | }, 22 | ), 23 | }, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 0..15, 30 | }, 31 | ) 32 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-17.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "message", 12 | span: 7..14, 13 | }, 14 | ), 15 | ], 16 | value: Int( 17 | Int { 18 | negative: false, 19 | value: 1, 20 | span: 17..18, 21 | }, 22 | ), 23 | }, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 0..19, 30 | }, 31 | ) 32 | -------------------------------------------------------------------------------- /protox-parse/src/case.rs: -------------------------------------------------------------------------------- 1 | pub(crate) fn is_valid_ident(s: &str) -> bool { 2 | !s.is_empty() 3 | && s.as_bytes()[0].is_ascii_alphabetic() 4 | && s.as_bytes()[1..] 5 | .iter() 6 | .all(|&ch| ch.is_ascii_alphanumeric() || ch == b'_') 7 | } 8 | 9 | pub(crate) fn is_valid_group_name(s: &str) -> bool { 10 | !s.is_empty() 11 | && s.as_bytes()[0].is_ascii_uppercase() 12 | && s.as_bytes()[1..] 13 | .iter() 14 | .all(|&ch| ch.is_ascii_alphanumeric() || ch == b'_') 15 | } 16 | 17 | pub(crate) fn to_pascal_case(name: &str) -> String { 18 | let mut result = String::with_capacity(name.len()); 19 | let mut uppercase_next = true; 20 | 21 | for ch in name.chars() { 22 | if ch == '_' { 23 | uppercase_next = true 24 | } else if uppercase_next { 25 | result.push(ch.to_ascii_uppercase()); 26 | uppercase_next = false; 27 | } else { 28 | result.push(ch); 29 | } 30 | } 31 | 32 | result 33 | } 34 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "optimize_for", 12 | span: 7..19, 13 | }, 14 | ), 15 | ], 16 | value: Ident { 17 | negative: false, 18 | ident: Ident { 19 | value: "message", 20 | span: 22..29, 21 | }, 22 | span: 22..29, 23 | }, 24 | }, 25 | comments: Comments { 26 | leading_detached_comments: [], 27 | leading_comment: None, 28 | trailing_comment: None, 29 | }, 30 | span: 0..30, 31 | }, 32 | ) 33 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: None, 8 | name: Ident { 9 | value: "projects", 10 | span: 30..38, 11 | }, 12 | kind: Map { 13 | ty_span: 11..29, 14 | key_ty: String, 15 | key_ty_span: 15..21, 16 | value_ty: Int32, 17 | value_ty_span: 23..28, 18 | }, 19 | number: Int { 20 | negative: false, 21 | value: 3, 22 | span: 41..42, 23 | }, 24 | options: None, 25 | comments: Comments { 26 | leading_detached_comments: [], 27 | leading_comment: Some( 28 | "leading", 29 | ), 30 | trailing_comment: Some( 31 | "trailing", 32 | ), 33 | }, 34 | span: 11..43, 35 | }, 36 | ) 37 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /protox/tests/data/google/unittest_preserve_unknown_enum2.proto: -------------------------------------------------------------------------------- 1 | // Protocol Buffers - Google's data interchange format 2 | // Copyright 2008 Google Inc. All rights reserved. 3 | // 4 | // Use of this source code is governed by a BSD-style 5 | // license that can be found in the LICENSE file or at 6 | // https://developers.google.com/open-source/licenses/bsd 7 | 8 | // Modified due to lack of edition support in protox 9 | 10 | syntax = "proto3"; 11 | 12 | package proto2_preserve_unknown_enum_unittest; 13 | 14 | // Treat all enums as closed and use expanded encoding for repeated fields by 15 | // default (proto2 behavior). 16 | option features.enum_type = CLOSED; 17 | option features.repeated_field_encoding = EXPANDED; 18 | 19 | enum MyEnum { 20 | FOO = 0; 21 | BAR = 1; 22 | BAZ = 2; 23 | } 24 | 25 | message MyMessage { 26 | MyEnum e = 1; 27 | repeated MyEnum repeated_e = 2; 28 | repeated MyEnum repeated_packed_e = 3 29 | [features.repeated_field_encoding = PACKED]; 30 | repeated MyEnum repeated_packed_unexpected_e = 4; // not packed 31 | oneof o { 32 | MyEnum oneof_e_1 = 5; 33 | MyEnum oneof_e_2 = 6; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 0..8, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "A", 15 | span: 15..16, 16 | }, 17 | kind: Group { 18 | ty_span: 9..14, 19 | body: MessageBody { 20 | items: [], 21 | extensions: [], 22 | options: [], 23 | reserved: [], 24 | }, 25 | }, 26 | number: Int { 27 | negative: false, 28 | value: 1, 29 | span: 19..20, 30 | }, 31 | options: None, 32 | comments: Comments { 33 | leading_detached_comments: [], 34 | leading_comment: None, 35 | trailing_comment: None, 36 | }, 37 | span: 0..24, 38 | }, 39 | ) 40 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 0..8, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "A", 15 | span: 15..16, 16 | }, 17 | kind: Group { 18 | ty_span: 9..14, 19 | body: MessageBody { 20 | items: [], 21 | extensions: [], 22 | options: [], 23 | reserved: [], 24 | }, 25 | }, 26 | number: Int { 27 | negative: false, 28 | value: 1, 29 | span: 19..20, 30 | }, 31 | options: None, 32 | comments: Comments { 33 | leading_detached_comments: [], 34 | leading_comment: None, 35 | trailing_comment: None, 36 | }, 37 | span: 0..28, 38 | }, 39 | ) 40 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "foo", 12 | span: 32..35, 13 | }, 14 | ), 15 | ], 16 | value: Int( 17 | Int { 18 | negative: false, 19 | value: 5, 20 | span: 38..39, 21 | }, 22 | ), 23 | }, 24 | comments: Comments { 25 | leading_detached_comments: [ 26 | "detached\n", 27 | ], 28 | leading_comment: Some( 29 | "leading", 30 | ), 31 | trailing_comment: Some( 32 | "trailing", 33 | ), 34 | }, 35 | span: 25..40, 36 | }, 37 | ) 38 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__syntax.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [], 12 | public_dependency: [], 13 | weak_dependency: [], 14 | message_type: [], 15 | enum_type: [], 16 | service: [], 17 | extension: [], 18 | options: None, 19 | source_code_info: Some( 20 | SourceCodeInfo { 21 | location: [ 22 | Location { 23 | path: [], 24 | span: [ 25 | 0, 26 | 0, 27 | 0, 28 | ], 29 | leading_comments: None, 30 | trailing_comments: None, 31 | leading_detached_comments: [], 32 | }, 33 | ], 34 | }, 35 | ), 36 | syntax: None, 37 | }, 38 | ) 39 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..47, 8 | syntax: Proto3, 9 | syntax_span: Some( 10 | ( 11 | 0..18, 12 | Comments { 13 | leading_detached_comments: [], 14 | leading_comment: None, 15 | trailing_comment: None, 16 | }, 17 | ), 18 | ), 19 | package: None, 20 | imports: [ 21 | Import { 22 | kind: None, 23 | value: "foo.proto", 24 | value_span: 35..46, 25 | comments: Comments { 26 | leading_detached_comments: [], 27 | leading_comment: None, 28 | trailing_comment: None, 29 | }, 30 | span: 28..47, 31 | }, 32 | ], 33 | options: [], 34 | items: [], 35 | }, 36 | ) 37 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_file() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..19, 8 | syntax: Proto2, 9 | syntax_span: None, 10 | package: Some( 11 | Package { 12 | name: FullIdent { 13 | parts: [ 14 | Ident { 15 | value: "protox", 16 | span: 8..14, 17 | }, 18 | Ident { 19 | value: "lib", 20 | span: 15..18, 21 | }, 22 | ], 23 | }, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 0..19, 30 | }, 31 | ), 32 | imports: [], 33 | options: [], 34 | items: [], 35 | }, 36 | ) 37 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 10..18, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "A", 15 | span: 25..26, 16 | }, 17 | kind: Group { 18 | ty_span: 19..24, 19 | body: MessageBody { 20 | items: [], 21 | extensions: [], 22 | options: [], 23 | reserved: [], 24 | }, 25 | }, 26 | number: Int { 27 | negative: false, 28 | value: 1, 29 | span: 29..30, 30 | }, 31 | options: None, 32 | comments: Comments { 33 | leading_detached_comments: [], 34 | leading_comment: Some( 35 | "leading\n", 36 | ), 37 | trailing_comment: Some( 38 | "trailing", 39 | ), 40 | }, 41 | span: 10..47, 42 | }, 43 | ) 44 | -------------------------------------------------------------------------------- /protox-parse/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "protox-parse" 3 | description = "Parsing of protobuf source files" 4 | keywords = ["protobuf", "serialization"] 5 | categories = ["compilers", "encoding", "parser-implementations"] 6 | version = "0.9.0" 7 | authors = ["Andrew Hickman "] 8 | repository = "https://github.com/andrewhickman/protox" 9 | documentation = "https://docs.rs/protox-parse" 10 | license = "MIT OR Apache-2.0" 11 | readme = "../README.md" 12 | edition = "2021" 13 | rust-version = "1.74.0" 14 | include = [ 15 | "LICENSE-APACHE", 16 | "LICENSE-MIT", 17 | "src/**/*.rs", 18 | ] 19 | 20 | [dependencies] 21 | logos = "0.15.0" 22 | miette = "7.2.0" 23 | prost-types = "0.14.0" 24 | thiserror = "2.0.0" 25 | 26 | [dev-dependencies] 27 | insta = "1.39.0" 28 | proptest = "1.3.1" 29 | 30 | [[package.metadata.release.pre-release-replacements]] 31 | file = "src/lib.rs" 32 | search = "html_root_url = \"https://docs.rs/protox-parse/[^/]*/\"" 33 | replace = "html_root_url = \"https://docs.rs/protox-parse/{{version}}/\"" 34 | exactly = 1 35 | 36 | [package.metadata.release] 37 | tag = false 38 | pre-release-commit-message = "(cargo-release) {{crate_name}} version {{version}}" 39 | 40 | [package.metadata.docs.rs] 41 | all-features = true 42 | rustdoc-args = ["--cfg", "docsrs"] 43 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_enum() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [ 13 | EnumValue { 14 | name: Ident { 15 | value: "BAR", 16 | span: 11..14, 17 | }, 18 | number: Int { 19 | negative: false, 20 | value: 1, 21 | span: 17..18, 22 | }, 23 | options: None, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 11..19, 30 | }, 31 | ], 32 | reserved: [], 33 | comments: Comments { 34 | leading_detached_comments: [], 35 | leading_comment: None, 36 | trailing_comment: None, 37 | }, 38 | span: 0..21, 39 | }, 40 | ) 41 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [ 13 | EnumValue { 14 | name: Ident { 15 | value: "message", 16 | span: 11..18, 17 | }, 18 | number: Int { 19 | negative: false, 20 | value: 1, 21 | span: 21..22, 22 | }, 23 | options: None, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 11..23, 30 | }, 31 | ], 32 | reserved: [], 33 | comments: Comments { 34 | leading_detached_comments: [], 35 | leading_comment: None, 36 | trailing_comment: None, 37 | }, 38 | span: 0..25, 39 | }, 40 | ) 41 | -------------------------------------------------------------------------------- /protox/tests/data/field_defaults.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Foo { 4 | optional double double = 1 [default = 4.2]; 5 | optional float float = 2 [default = 2.4e-2]; 6 | optional int32 int32 = 3 [default = -1]; 7 | optional int64 int64 = 4 [default = -3221225470]; 8 | optional uint32 uint32 = 5 [default = 0]; 9 | optional uint64 uint64 = 6 [default = 3221225470]; 10 | optional sint32 sint32 = 7 [default = -5]; 11 | optional sint64 sint64 = 8 [default = 42]; 12 | optional fixed32 fixed32 = 9 [default = 5]; 13 | optional fixed64 fixed64 = 10 [default = 7]; 14 | optional sfixed32 sfixed32 = 11 [default = -100]; 15 | optional sfixed64 sfixed64 = 12 [default = 10]; 16 | optional bool bool = 13 [default = true]; 17 | optional string string = 14 [default = "hello"]; 18 | optional bytes bytes = 15 [default = "abc\366\xFE\a\b\f\n\r\t\v\\\'\"\x00"]; 19 | optional Enum enum = 16 [default = ZERO]; 20 | 21 | optional double double_int = 17 [default = 42]; 22 | optional double double_int_negative = 18 [default = -24]; 23 | optional double double_nan = 19 [default = nan]; 24 | optional double double_inf = 20 [default = inf]; 25 | optional double double_nan_negative = 21 [default = -nan]; 26 | optional double double_inf_negative = 22 [default = -inf]; 27 | } 28 | 29 | enum Enum { 30 | ZERO = 0; 31 | } 32 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: None, 8 | name: Ident { 9 | value: "projects", 10 | span: 21..29, 11 | }, 12 | kind: Map { 13 | ty_span: 0..20, 14 | key_ty: String, 15 | key_ty_span: 4..10, 16 | value_ty: Named( 17 | TypeName { 18 | leading_dot: None, 19 | name: FullIdent { 20 | parts: [ 21 | Ident { 22 | value: "Project", 23 | span: 12..19, 24 | }, 25 | ], 26 | }, 27 | }, 28 | ), 29 | value_ty_span: 12..19, 30 | }, 31 | number: Int { 32 | negative: false, 33 | value: 3, 34 | span: 32..33, 35 | }, 36 | options: None, 37 | comments: Comments { 38 | leading_detached_comments: [], 39 | leading_comment: None, 40 | trailing_comment: None, 41 | }, 42 | span: 0..34, 43 | }, 44 | ) 45 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_oneof() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [ 13 | Field { 14 | label: None, 15 | name: Ident { 16 | value: "bar", 17 | span: 18..21, 18 | }, 19 | kind: Normal { 20 | ty: Int32, 21 | ty_span: 12..17, 22 | }, 23 | number: Int { 24 | negative: false, 25 | value: 1, 26 | span: 24..25, 27 | }, 28 | options: None, 29 | comments: Comments { 30 | leading_detached_comments: [], 31 | leading_comment: None, 32 | trailing_comment: None, 33 | }, 34 | span: 12..26, 35 | }, 36 | ], 37 | comments: Comments { 38 | leading_detached_comments: [], 39 | leading_comment: None, 40 | trailing_comment: None, 41 | }, 42 | span: 0..28, 43 | }, 44 | ) 45 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Extension( 10 | TypeName { 11 | leading_dot: None, 12 | name: FullIdent { 13 | parts: [ 14 | Ident { 15 | value: "ext", 16 | span: 8..11, 17 | }, 18 | ], 19 | }, 20 | }, 21 | 7..12, 22 | ), 23 | Ident( 24 | Ident { 25 | value: "foo", 26 | span: 13..16, 27 | }, 28 | ), 29 | ], 30 | value: Aggregate( 31 | "foo : 5", 32 | 19..29, 33 | ), 34 | }, 35 | comments: Comments { 36 | leading_detached_comments: [], 37 | leading_comment: None, 38 | trailing_comment: None, 39 | }, 40 | span: 0..30, 41 | }, 42 | ) 43 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "quz", 12 | span: 7..10, 13 | }, 14 | ), 15 | Extension( 16 | TypeName { 17 | leading_dot: None, 18 | name: FullIdent { 19 | parts: [ 20 | Ident { 21 | value: "bar", 22 | span: 12..15, 23 | }, 24 | ], 25 | }, 26 | }, 27 | 11..16, 28 | ), 29 | ], 30 | value: Aggregate( 31 | "foo : [ blah ]", 32 | 19..34, 33 | ), 34 | }, 35 | comments: Comments { 36 | leading_detached_comments: [], 37 | leading_comment: None, 38 | trailing_comment: None, 39 | }, 40 | span: 0..35, 41 | }, 42 | ) 43 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Extension( 10 | TypeName { 11 | leading_dot: None, 12 | name: FullIdent { 13 | parts: [ 14 | Ident { 15 | value: "foo", 16 | span: 8..11, 17 | }, 18 | Ident { 19 | value: "bar", 20 | span: 12..15, 21 | }, 22 | ], 23 | }, 24 | }, 25 | 7..16, 26 | ), 27 | ], 28 | value: String( 29 | String { 30 | value: "hello", 31 | span: 19..26, 32 | }, 33 | ), 34 | }, 35 | comments: Comments { 36 | leading_detached_comments: [], 37 | leading_comment: None, 38 | trailing_comment: None, 39 | }, 40 | span: 0..27, 41 | }, 42 | ) 43 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 35..63, 8 | syntax: Proto2, 9 | syntax_span: None, 10 | package: None, 11 | imports: [], 12 | options: [ 13 | Option { 14 | body: OptionBody { 15 | name: [ 16 | Ident( 17 | Ident { 18 | value: "optimize_for", 19 | span: 42..54, 20 | }, 21 | ), 22 | ], 23 | value: Ident { 24 | negative: false, 25 | ident: Ident { 26 | value: "SPEED", 27 | span: 57..62, 28 | }, 29 | span: 57..62, 30 | }, 31 | }, 32 | comments: Comments { 33 | leading_detached_comments: [], 34 | leading_comment: Some( 35 | " code goes brrr\n", 36 | ), 37 | trailing_comment: None, 38 | }, 39 | span: 35..63, 40 | }, 41 | ], 42 | items: [], 43 | }, 44 | ) 45 | -------------------------------------------------------------------------------- /protox/tests/data/google/unittest_preserve_unknown_enum.proto: -------------------------------------------------------------------------------- 1 | // Protocol Buffers - Google's data interchange format 2 | // Copyright 2008 Google Inc. All rights reserved. 3 | // 4 | // Use of this source code is governed by a BSD-style 5 | // license that can be found in the LICENSE file or at 6 | // https://developers.google.com/open-source/licenses/bsd 7 | 8 | // Modified due to lack of edition support in protox 9 | 10 | syntax = "proto3"; 11 | 12 | package proto3_preserve_unknown_enum_unittest; 13 | 14 | // Treat all fields as implicit present by default (proto3 behavior). 15 | option features.field_presence = IMPLICIT; 16 | option objc_class_prefix = "UnknownEnums"; 17 | option csharp_namespace = "Google.Protobuf.TestProtos"; 18 | 19 | enum MyEnum { 20 | FOO = 0; 21 | BAR = 1; 22 | BAZ = 2; 23 | } 24 | 25 | enum MyEnumPlusExtra { 26 | E_FOO = 0; 27 | E_BAR = 1; 28 | E_BAZ = 2; 29 | E_EXTRA = 3; 30 | } 31 | 32 | message MyMessage { 33 | MyEnum e = 1; 34 | repeated MyEnum repeated_e = 2; 35 | repeated MyEnum repeated_packed_e = 3; 36 | repeated MyEnumPlusExtra repeated_packed_unexpected_e = 4; // not packed 37 | oneof o { 38 | MyEnum oneof_e_1 = 5; 39 | MyEnum oneof_e_2 = 6; 40 | } 41 | } 42 | 43 | message MyMessagePlusExtra { 44 | MyEnumPlusExtra e = 1; 45 | repeated MyEnumPlusExtra repeated_e = 2; 46 | repeated MyEnumPlusExtra repeated_packed_e = 3; 47 | repeated MyEnumPlusExtra repeated_packed_unexpected_e = 4; 48 | oneof o { 49 | MyEnumPlusExtra oneof_e_1 = 5; 50 | MyEnumPlusExtra oneof_e_2 = 6; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Extension( 10 | TypeName { 11 | leading_dot: None, 12 | name: FullIdent { 13 | parts: [ 14 | Ident { 15 | value: "foo", 16 | span: 8..11, 17 | }, 18 | ], 19 | }, 20 | }, 21 | 7..12, 22 | ), 23 | Ident( 24 | Ident { 25 | value: "bar", 26 | span: 13..16, 27 | }, 28 | ), 29 | ], 30 | value: Ident { 31 | negative: false, 32 | ident: Ident { 33 | value: "true", 34 | span: 19..23, 35 | }, 36 | span: 19..23, 37 | }, 38 | }, 39 | comments: Comments { 40 | leading_detached_comments: [], 41 | leading_comment: None, 42 | trailing_comment: None, 43 | }, 44 | span: 0..24, 45 | }, 46 | ) 47 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: None, 8 | name: Ident { 9 | value: "invalid", 10 | span: 20..27, 11 | }, 12 | kind: Map { 13 | ty_span: 0..19, 14 | key_ty: Named( 15 | TypeName { 16 | leading_dot: Some( 17 | 4..5, 18 | ), 19 | name: FullIdent { 20 | parts: [ 21 | Ident { 22 | value: "foo", 23 | span: 5..8, 24 | }, 25 | Ident { 26 | value: "bar", 27 | span: 9..12, 28 | }, 29 | ], 30 | }, 31 | }, 32 | ), 33 | key_ty_span: 4..12, 34 | value_ty: Bool, 35 | value_ty_span: 14..18, 36 | }, 37 | number: Int { 38 | negative: true, 39 | value: 0, 40 | span: 30..32, 41 | }, 42 | options: None, 43 | comments: Comments { 44 | leading_detached_comments: [], 45 | leading_comment: None, 46 | trailing_comment: None, 47 | }, 48 | span: 0..33, 49 | }, 50 | ) 51 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_oneof() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [ 13 | Field { 14 | label: None, 15 | name: Ident { 16 | value: "Baz", 17 | span: 18..21, 18 | }, 19 | kind: Group { 20 | ty_span: 12..17, 21 | body: MessageBody { 22 | items: [], 23 | extensions: [], 24 | options: [], 25 | reserved: [], 26 | }, 27 | }, 28 | number: Int { 29 | negative: true, 30 | value: 1, 31 | span: 24..26, 32 | }, 33 | options: None, 34 | comments: Comments { 35 | leading_detached_comments: [], 36 | leading_comment: None, 37 | trailing_comment: None, 38 | }, 39 | span: 12..29, 40 | }, 41 | ], 42 | comments: Comments { 43 | leading_detached_comments: [], 44 | leading_comment: None, 45 | trailing_comment: None, 46 | }, 47 | span: 0..31, 48 | }, 49 | ) 50 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-26.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [ 12 | Option { 13 | body: OptionBody { 14 | name: [ 15 | Ident( 16 | Ident { 17 | value: "foo", 18 | span: 33..36, 19 | }, 20 | ), 21 | ], 22 | value: Ident { 23 | negative: false, 24 | ident: Ident { 25 | value: "bar", 26 | span: 39..42, 27 | }, 28 | span: 39..42, 29 | }, 30 | }, 31 | comments: Comments { 32 | leading_detached_comments: [], 33 | leading_comment: None, 34 | trailing_comment: None, 35 | }, 36 | span: 26..43, 37 | }, 38 | ], 39 | methods: [], 40 | comments: Comments { 41 | leading_detached_comments: [], 42 | leading_comment: None, 43 | trailing_comment: None, 44 | }, 45 | span: 0..53, 46 | }, 47 | ) 48 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__syntax-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"syntax = 'proto2';\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [], 12 | public_dependency: [], 13 | weak_dependency: [], 14 | message_type: [], 15 | enum_type: [], 16 | service: [], 17 | extension: [], 18 | options: None, 19 | source_code_info: Some( 20 | SourceCodeInfo { 21 | location: [ 22 | Location { 23 | path: [], 24 | span: [ 25 | 0, 26 | 0, 27 | 18, 28 | ], 29 | leading_comments: None, 30 | trailing_comments: None, 31 | leading_detached_comments: [], 32 | }, 33 | Location { 34 | path: [ 35 | 12, 36 | ], 37 | span: [ 38 | 0, 39 | 0, 40 | 18, 41 | ], 42 | leading_comments: None, 43 | trailing_comments: None, 44 | leading_detached_comments: [], 45 | }, 46 | ], 47 | }, 48 | ), 49 | syntax: None, 50 | }, 51 | ) 52 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__syntax-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"syntax = 'proto3';\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [], 12 | public_dependency: [], 13 | weak_dependency: [], 14 | message_type: [], 15 | enum_type: [], 16 | service: [], 17 | extension: [], 18 | options: None, 19 | source_code_info: Some( 20 | SourceCodeInfo { 21 | location: [ 22 | Location { 23 | path: [], 24 | span: [ 25 | 0, 26 | 0, 27 | 18, 28 | ], 29 | leading_comments: None, 30 | trailing_comments: None, 31 | leading_detached_comments: [], 32 | }, 33 | Location { 34 | path: [ 35 | 12, 36 | ], 37 | span: [ 38 | 0, 39 | 0, 40 | 18, 41 | ], 42 | leading_comments: None, 43 | trailing_comments: None, 44 | leading_detached_comments: [], 45 | }, 46 | ], 47 | }, 48 | ), 49 | syntax: Some( 50 | "proto3", 51 | ), 52 | }, 53 | ) 54 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_reserved-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_reserved() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Reserved { 7 | kind: Ranges( 8 | [ 9 | ReservedRange { 10 | start: Int { 11 | negative: false, 12 | value: 0, 13 | span: 9..10, 14 | }, 15 | end: None, 16 | }, 17 | ReservedRange { 18 | start: Int { 19 | negative: false, 20 | value: 2, 21 | span: 12..13, 22 | }, 23 | end: Int( 24 | Int { 25 | negative: false, 26 | value: 3, 27 | span: 17..18, 28 | }, 29 | ), 30 | }, 31 | ReservedRange { 32 | start: Int { 33 | negative: false, 34 | value: 5, 35 | span: 20..21, 36 | }, 37 | end: Max( 38 | 25..28, 39 | ), 40 | }, 41 | ], 42 | ), 43 | comments: Comments { 44 | leading_detached_comments: [], 45 | leading_comment: None, 46 | trailing_comment: None, 47 | }, 48 | span: 0..29, 49 | }, 50 | ) 51 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-18.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "ext", 12 | span: 7..10, 13 | }, 14 | ), 15 | Extension( 16 | TypeName { 17 | leading_dot: None, 18 | name: FullIdent { 19 | parts: [ 20 | Ident { 21 | value: "service", 22 | span: 12..19, 23 | }, 24 | Ident { 25 | value: "rpc", 26 | span: 20..23, 27 | }, 28 | ], 29 | }, 30 | }, 31 | 11..24, 32 | ), 33 | ], 34 | value: Int( 35 | Int { 36 | negative: false, 37 | value: 1, 38 | span: 27..28, 39 | }, 40 | ), 41 | }, 42 | comments: Comments { 43 | leading_detached_comments: [], 44 | leading_comment: None, 45 | trailing_comment: None, 46 | }, 47 | span: 0..29, 48 | }, 49 | ) 50 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release-plz 2 | 3 | permissions: 4 | pull-requests: write 5 | contents: write 6 | 7 | on: 8 | push: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | 14 | # Release unpublished packages. 15 | release-plz-release: 16 | name: Release-plz release 17 | runs-on: ubuntu-latest 18 | permissions: 19 | contents: write 20 | steps: 21 | - name: Checkout repository 22 | uses: actions/checkout@v4 23 | with: 24 | fetch-depth: 0 25 | - name: Install Rust toolchain 26 | uses: dtolnay/rust-toolchain@stable 27 | - name: Run release-plz 28 | uses: release-plz/action@v0.5 29 | with: 30 | command: release 31 | env: 32 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 33 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} 34 | 35 | # Create a PR with the new versions and changelog, preparing the next release. 36 | release-plz-pr: 37 | name: Release-plz PR 38 | runs-on: ubuntu-latest 39 | permissions: 40 | contents: write 41 | pull-requests: write 42 | concurrency: 43 | group: release-plz-${{ github.ref }} 44 | cancel-in-progress: false 45 | steps: 46 | - name: Checkout repository 47 | uses: actions/checkout@v4 48 | with: 49 | fetch-depth: 0 50 | - name: Install Rust toolchain 51 | uses: dtolnay/rust-toolchain@stable 52 | - name: Run release-plz 53 | uses: release-plz/action@v0.5 54 | with: 55 | command: release-pr 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} 59 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__imports.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"import 'foo.proto';\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [ 12 | "foo.proto", 13 | ], 14 | public_dependency: [], 15 | weak_dependency: [], 16 | message_type: [], 17 | enum_type: [], 18 | service: [], 19 | extension: [], 20 | options: None, 21 | source_code_info: Some( 22 | SourceCodeInfo { 23 | location: [ 24 | Location { 25 | path: [], 26 | span: [ 27 | 0, 28 | 0, 29 | 19, 30 | ], 31 | leading_comments: None, 32 | trailing_comments: None, 33 | leading_detached_comments: [], 34 | }, 35 | Location { 36 | path: [ 37 | 3, 38 | 0, 39 | ], 40 | span: [ 41 | 0, 42 | 0, 43 | 19, 44 | ], 45 | leading_comments: None, 46 | trailing_comments: None, 47 | leading_detached_comments: [], 48 | }, 49 | ], 50 | }, 51 | ), 52 | syntax: None, 53 | }, 54 | ) 55 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_file-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | File { 7 | span: 0..56, 8 | syntax: Proto2, 9 | syntax_span: Some( 10 | ( 11 | 0..18, 12 | Comments { 13 | leading_detached_comments: [], 14 | leading_comment: None, 15 | trailing_comment: None, 16 | }, 17 | ), 18 | ), 19 | package: None, 20 | imports: [], 21 | options: [ 22 | Option { 23 | body: OptionBody { 24 | name: [ 25 | Ident( 26 | Ident { 27 | value: "optimize_for", 28 | span: 35..47, 29 | }, 30 | ), 31 | ], 32 | value: Ident { 33 | negative: false, 34 | ident: Ident { 35 | value: "SPEED", 36 | span: 50..55, 37 | }, 38 | span: 50..55, 39 | }, 40 | }, 41 | comments: Comments { 42 | leading_detached_comments: [], 43 | leading_comment: None, 44 | trailing_comment: None, 45 | }, 46 | span: 28..56, 47 | }, 48 | ], 49 | items: [], 50 | }, 51 | ) 52 | -------------------------------------------------------------------------------- /protox/src/file/google.rs: -------------------------------------------------------------------------------- 1 | use prost_reflect::DescriptorPool; 2 | 3 | use super::{File, FileResolver}; 4 | use crate::Error; 5 | 6 | /// An implementation of [`FileResolver`] which resolves well-known imports such as `google/protobuf/descriptor.proto`. 7 | #[derive(Debug, Default)] 8 | pub struct GoogleFileResolver { 9 | pool: DescriptorPool, 10 | } 11 | 12 | impl GoogleFileResolver { 13 | /// Creates a new instance of [`GoogleFileResolver`]. 14 | pub fn new() -> Self { 15 | GoogleFileResolver { 16 | pool: DescriptorPool::global(), 17 | } 18 | } 19 | } 20 | 21 | impl FileResolver for GoogleFileResolver { 22 | fn open_file(&self, name: &str) -> Result { 23 | match name { 24 | "google/protobuf/any.proto" 25 | | "google/protobuf/api.proto" 26 | | "google/protobuf/descriptor.proto" 27 | | "google/protobuf/duration.proto" 28 | | "google/protobuf/empty.proto" 29 | | "google/protobuf/field_mask.proto" 30 | | "google/protobuf/source_context.proto" 31 | | "google/protobuf/struct.proto" 32 | | "google/protobuf/timestamp.proto" 33 | | "google/protobuf/type.proto" 34 | | "google/protobuf/wrappers.proto" 35 | | "google/protobuf/compiler/plugin.proto" => { 36 | let file = self 37 | .pool 38 | .get_file_by_name(name) 39 | .expect("well-known file not found"); 40 | Ok(File::from_file_descriptor_proto( 41 | file.file_descriptor_proto().clone(), 42 | )) 43 | } 44 | _ => Err(Error::file_not_found(name)), 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-15.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Field { 7 | label: None, 8 | name: Ident { 9 | value: "double", 10 | span: 7..13, 11 | }, 12 | kind: Normal { 13 | ty: Double, 14 | ty_span: 0..6, 15 | }, 16 | number: Int { 17 | negative: false, 18 | value: 1, 19 | span: 16..17, 20 | }, 21 | options: Some( 22 | OptionList { 23 | options: [ 24 | OptionBody { 25 | name: [ 26 | Ident( 27 | Ident { 28 | value: "default", 29 | span: 19..26, 30 | }, 31 | ), 32 | ], 33 | value: Ident { 34 | negative: true, 35 | ident: Ident { 36 | value: "nan", 37 | span: 30..33, 38 | }, 39 | span: 29..33, 40 | }, 41 | }, 42 | ], 43 | span: 18..34, 44 | }, 45 | ), 46 | comments: Comments { 47 | leading_detached_comments: [], 48 | leading_comment: None, 49 | trailing_comment: None, 50 | }, 51 | span: 0..35, 52 | }, 53 | ) 54 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-22.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "ext", 12 | span: 7..10, 13 | }, 14 | ), 15 | Extension( 16 | TypeName { 17 | leading_dot: Some( 18 | 12..13, 19 | ), 20 | name: FullIdent { 21 | parts: [ 22 | Ident { 23 | value: "foo", 24 | span: 13..16, 25 | }, 26 | Ident { 27 | value: "bar", 28 | span: 17..20, 29 | }, 30 | ], 31 | }, 32 | }, 33 | 11..21, 34 | ), 35 | ], 36 | value: Int( 37 | Int { 38 | negative: false, 39 | value: 42, 40 | span: 24..26, 41 | }, 42 | ), 43 | }, 44 | comments: Comments { 45 | leading_detached_comments: [], 46 | leading_comment: None, 47 | trailing_comment: None, 48 | }, 49 | span: 0..27, 50 | }, 51 | ) 52 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_oneof() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [ 13 | Field { 14 | label: Some( 15 | ( 16 | Optional, 17 | 12..20, 18 | ), 19 | ), 20 | name: Ident { 21 | value: "Bar", 22 | span: 27..30, 23 | }, 24 | kind: Group { 25 | ty_span: 21..26, 26 | body: MessageBody { 27 | items: [], 28 | extensions: [], 29 | options: [], 30 | reserved: [], 31 | }, 32 | }, 33 | number: Int { 34 | negative: false, 35 | value: 1, 36 | span: 33..34, 37 | }, 38 | options: None, 39 | comments: Comments { 40 | leading_detached_comments: [], 41 | leading_comment: None, 42 | trailing_comment: None, 43 | }, 44 | span: 12..37, 45 | }, 46 | ], 47 | comments: Comments { 48 | leading_detached_comments: [], 49 | leading_comment: None, 50 | trailing_comment: None, 51 | }, 52 | span: 0..39, 53 | }, 54 | ) 55 | -------------------------------------------------------------------------------- /protox/src/file/chain.rs: -------------------------------------------------------------------------------- 1 | use std::{fmt, path::Path}; 2 | 3 | use super::{File, FileResolver}; 4 | use crate::Error; 5 | 6 | /// An implementation of [`FileResolver`] which chains together several other resolvers. 7 | /// 8 | /// When opening files, each resolver is searched in turn until the file is found. 9 | #[derive(Default)] 10 | pub struct ChainFileResolver { 11 | resolvers: Vec>, 12 | } 13 | 14 | impl ChainFileResolver { 15 | /// Creates a new, empty [`ChainFileResolver`]. 16 | pub fn new() -> Self { 17 | Default::default() 18 | } 19 | 20 | /// Adds a new resolver. 21 | /// 22 | /// The new resolver will be searched after all previously-added resolvers. 23 | pub fn add(&mut self, resolver: F) 24 | where 25 | F: FileResolver + 'static, 26 | { 27 | self.resolvers.push(Box::new(resolver)) 28 | } 29 | } 30 | 31 | impl FileResolver for ChainFileResolver { 32 | fn resolve_path(&self, path: &Path) -> Option { 33 | for resolver in &self.resolvers { 34 | if let Some(name) = resolver.resolve_path(path) { 35 | return Some(name); 36 | } 37 | } 38 | 39 | None 40 | } 41 | 42 | fn open_file(&self, name: &str) -> Result { 43 | for resolver in &self.resolvers { 44 | match resolver.open_file(name) { 45 | Ok(file) => return Ok(file), 46 | Err(err) if err.is_file_not_found() => continue, 47 | Err(err) => return Err(err), 48 | } 49 | } 50 | 51 | Err(Error::file_not_found(name)) 52 | } 53 | } 54 | 55 | impl fmt::Debug for ChainFileResolver { 56 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 57 | f.debug_struct("ChainFileResolver").finish_non_exhaustive() 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /protox/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::PathBuf}; 2 | 3 | use clap::Parser; 4 | use miette::Result; 5 | use protox::Compiler; 6 | 7 | #[derive(Debug, Parser)] 8 | pub struct Args { 9 | /// The source file(s) to compile 10 | #[clap(value_name = "PROTO_FILES", required = true, value_parser)] 11 | files: Vec, 12 | /// The directory in which to search for imports. 13 | #[clap( 14 | short = 'I', 15 | long = "include", 16 | visible_alias = "proto_path", 17 | value_name = "PATH", 18 | default_value = ".", 19 | value_parser 20 | )] 21 | includes: Vec, 22 | /// The output path to write a file descriptor set to. 23 | #[clap( 24 | short = 'o', 25 | long = "output", 26 | visible_alias = "descriptor_set_out", 27 | value_name = "PATH", 28 | value_parser 29 | )] 30 | output: Option, 31 | /// If set, includes source code information in the output file descriptor set. 32 | #[clap(long, visible_alias = "include_source_info")] 33 | include_source_info: bool, 34 | /// If set, all dependencies of the input files are output, so that the file descriptor set is self-contained. 35 | #[clap(long, visible_alias = "include_imports")] 36 | include_imports: bool, 37 | } 38 | 39 | pub fn main() -> Result<()> { 40 | miette::set_panic_hook(); 41 | 42 | let args = Args::parse(); 43 | let mut compiler = Compiler::new(args.includes)?; 44 | compiler.include_imports(args.include_imports); 45 | compiler.include_source_info(args.include_source_info); 46 | for file in args.files { 47 | compiler.open_file(file)?; 48 | } 49 | if let Some(output) = args.output { 50 | fs::write(output, compiler.encode_file_descriptor_set()) 51 | .map_err(|err| miette::miette!(err))?; 52 | } 53 | Ok(()) 54 | } 55 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_extension-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_extend() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Extend { 7 | extendee: TypeName { 8 | leading_dot: None, 9 | name: FullIdent { 10 | parts: [ 11 | Ident { 12 | value: "Foo", 13 | span: 7..10, 14 | }, 15 | Ident { 16 | value: "Foo", 17 | span: 11..14, 18 | }, 19 | ], 20 | }, 21 | }, 22 | fields: [ 23 | Field { 24 | label: Some( 25 | ( 26 | Optional, 27 | 17..25, 28 | ), 29 | ), 30 | name: Ident { 31 | value: "bar", 32 | span: 32..35, 33 | }, 34 | kind: Normal { 35 | ty: Int32, 36 | ty_span: 26..31, 37 | }, 38 | number: Int { 39 | negative: false, 40 | value: 126, 41 | span: 38..41, 42 | }, 43 | options: None, 44 | comments: Comments { 45 | leading_detached_comments: [], 46 | leading_comment: None, 47 | trailing_comment: None, 48 | }, 49 | span: 17..42, 50 | }, 51 | ], 52 | comments: Comments { 53 | leading_detached_comments: [], 54 | leading_comment: None, 55 | trailing_comment: None, 56 | }, 57 | span: 0..44, 58 | }, 59 | ) 60 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_option-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Option { 7 | body: OptionBody { 8 | name: [ 9 | Ident( 10 | Ident { 11 | value: "foo", 12 | span: 7..10, 13 | }, 14 | ), 15 | Extension( 16 | TypeName { 17 | leading_dot: None, 18 | name: FullIdent { 19 | parts: [ 20 | Ident { 21 | value: "bar", 22 | span: 12..15, 23 | }, 24 | Ident { 25 | value: "baz", 26 | span: 16..19, 27 | }, 28 | ], 29 | }, 30 | }, 31 | 11..20, 32 | ), 33 | Ident( 34 | Ident { 35 | value: "qux", 36 | span: 21..24, 37 | }, 38 | ), 39 | ], 40 | value: Ident { 41 | negative: false, 42 | ident: Ident { 43 | value: "ident", 44 | span: 27..32, 45 | }, 46 | span: 27..32, 47 | }, 48 | }, 49 | comments: Comments { 50 | leading_detached_comments: [], 51 | leading_comment: None, 52 | trailing_comment: None, 53 | }, 54 | span: 0..33, 55 | }, 56 | ) 57 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-12.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [ 13 | Field { 14 | label: None, 15 | name: Ident { 16 | value: "bar", 17 | span: 18..21, 18 | }, 19 | kind: Normal { 20 | ty: Named( 21 | TypeName { 22 | leading_dot: None, 23 | name: FullIdent { 24 | parts: [ 25 | Ident { 26 | value: "oneof", 27 | span: 12..17, 28 | }, 29 | ], 30 | }, 31 | }, 32 | ), 33 | ty_span: 12..17, 34 | }, 35 | number: Int { 36 | negative: false, 37 | value: 1, 38 | span: 24..25, 39 | }, 40 | options: None, 41 | comments: Comments { 42 | leading_detached_comments: [], 43 | leading_comment: None, 44 | trailing_comment: None, 45 | }, 46 | span: 12..26, 47 | }, 48 | ], 49 | comments: Comments { 50 | leading_detached_comments: [], 51 | leading_comment: None, 52 | trailing_comment: None, 53 | }, 54 | span: 0..28, 55 | }, 56 | ) 57 | -------------------------------------------------------------------------------- /protox-parse/src/parse/comments.rs: -------------------------------------------------------------------------------- 1 | use std::{borrow::Cow, mem::take}; 2 | 3 | #[derive(Default, Clone)] 4 | pub(super) struct Comments { 5 | leading_detached: Vec, 6 | leading: Option, 7 | trailing: Option, 8 | 9 | is_trailing: bool, 10 | is_line_comment: bool, 11 | } 12 | 13 | impl Comments { 14 | pub fn new() -> Comments { 15 | Comments::default() 16 | } 17 | 18 | pub fn block_comment(&mut self, comment: Cow) { 19 | if self.leading.is_some() { 20 | self.flush(); 21 | } 22 | self.leading = Some(comment.into_owned()); 23 | } 24 | 25 | pub fn line_comment(&mut self, comment: Cow) { 26 | if self.leading.is_some() && !self.is_line_comment { 27 | self.flush(); 28 | } 29 | match &mut self.leading { 30 | None => self.leading = Some(comment.into_owned()), 31 | Some(current) => current.push_str(comment.as_ref()), 32 | } 33 | self.is_line_comment = true; 34 | } 35 | 36 | pub fn detach(&mut self) { 37 | self.is_trailing = false; 38 | } 39 | 40 | pub fn flush(&mut self) { 41 | if self.is_trailing { 42 | debug_assert!(self.leading_detached.is_empty()); 43 | self.trailing = self.leading.take(); 44 | self.is_trailing = false; 45 | } else { 46 | self.leading_detached.extend(self.leading.take()); 47 | } 48 | self.is_line_comment = false; 49 | } 50 | 51 | pub fn reset(&mut self) { 52 | self.leading = None; 53 | self.leading_detached.clear(); 54 | self.trailing = None; 55 | 56 | self.is_trailing = true; 57 | self.is_line_comment = false; 58 | } 59 | 60 | pub fn take_leading(&mut self) -> (Vec, Option) { 61 | (take(&mut self.leading_detached), take(&mut self.leading)) 62 | } 63 | 64 | pub fn take_trailing(&mut self) -> Option { 65 | take(&mut self.trailing) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-10.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_message() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | body: MessageBody { 12 | items: [ 13 | Field( 14 | Field { 15 | label: None, 16 | name: Ident { 17 | value: "Baz", 18 | span: 20..23, 19 | }, 20 | kind: Group { 21 | ty_span: 14..19, 22 | body: MessageBody { 23 | items: [], 24 | extensions: [], 25 | options: [], 26 | reserved: [], 27 | }, 28 | }, 29 | number: Int { 30 | negative: false, 31 | value: 1, 32 | span: 26..27, 33 | }, 34 | options: None, 35 | comments: Comments { 36 | leading_detached_comments: [], 37 | leading_comment: None, 38 | trailing_comment: None, 39 | }, 40 | span: 14..30, 41 | }, 42 | ), 43 | ], 44 | extensions: [], 45 | options: [], 46 | reserved: [], 47 | }, 48 | comments: Comments { 49 | leading_detached_comments: [], 50 | leading_comment: None, 51 | trailing_comment: None, 52 | }, 53 | span: 0..32, 54 | }, 55 | ) 56 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 0..8, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "A", 15 | span: 15..16, 16 | }, 17 | kind: Group { 18 | ty_span: 9..14, 19 | body: MessageBody { 20 | items: [], 21 | extensions: [], 22 | options: [], 23 | reserved: [], 24 | }, 25 | }, 26 | number: Int { 27 | negative: false, 28 | value: 1, 29 | span: 19..20, 30 | }, 31 | options: Some( 32 | OptionList { 33 | options: [ 34 | OptionBody { 35 | name: [ 36 | Ident( 37 | Ident { 38 | value: "deprecated", 39 | span: 22..32, 40 | }, 41 | ), 42 | ], 43 | value: Ident { 44 | negative: false, 45 | ident: Ident { 46 | value: "true", 47 | span: 35..39, 48 | }, 49 | span: 35..39, 50 | }, 51 | }, 52 | ], 53 | span: 21..40, 54 | }, 55 | ), 56 | comments: Comments { 57 | leading_detached_comments: [], 58 | leading_comment: None, 59 | trailing_comment: None, 60 | }, 61 | span: 0..44, 62 | }, 63 | ) 64 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_oneof-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Oneof { 7 | name: Ident { 8 | value: "Foo", 9 | span: 6..9, 10 | }, 11 | options: [], 12 | fields: [ 13 | Field { 14 | label: Some( 15 | ( 16 | Required, 17 | 12..20, 18 | ), 19 | ), 20 | name: Ident { 21 | value: "bar", 22 | span: 27..30, 23 | }, 24 | kind: Normal { 25 | ty: Named( 26 | TypeName { 27 | leading_dot: None, 28 | name: FullIdent { 29 | parts: [ 30 | Ident { 31 | value: "oneof", 32 | span: 21..26, 33 | }, 34 | ], 35 | }, 36 | }, 37 | ), 38 | ty_span: 21..26, 39 | }, 40 | number: Int { 41 | negative: false, 42 | value: 1, 43 | span: 33..34, 44 | }, 45 | options: None, 46 | comments: Comments { 47 | leading_detached_comments: [], 48 | leading_comment: None, 49 | trailing_comment: None, 50 | }, 51 | span: 12..35, 52 | }, 53 | ], 54 | comments: Comments { 55 | leading_detached_comments: [], 56 | leading_comment: None, 57 | trailing_comment: None, 58 | }, 59 | span: 0..37, 60 | }, 61 | ) 62 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_enum() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [ 13 | EnumValue { 14 | name: Ident { 15 | value: "BAR", 16 | span: 11..14, 17 | }, 18 | number: Int { 19 | negative: false, 20 | value: 0, 21 | span: 17..18, 22 | }, 23 | options: None, 24 | comments: Comments { 25 | leading_detached_comments: [], 26 | leading_comment: None, 27 | trailing_comment: None, 28 | }, 29 | span: 11..19, 30 | }, 31 | ], 32 | reserved: [ 33 | Reserved { 34 | kind: Ranges( 35 | [ 36 | ReservedRange { 37 | start: Int { 38 | negative: true, 39 | value: 1, 40 | span: 29..31, 41 | }, 42 | end: Max( 43 | 35..38, 44 | ), 45 | }, 46 | ], 47 | ), 48 | comments: Comments { 49 | leading_detached_comments: [], 50 | leading_comment: None, 51 | trailing_comment: None, 52 | }, 53 | span: 20..39, 54 | }, 55 | ], 56 | comments: Comments { 57 | leading_detached_comments: [], 58 | leading_comment: None, 59 | trailing_comment: None, 60 | }, 61 | span: 0..41, 62 | }, 63 | ) 64 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-9.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_message() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | body: MessageBody { 12 | items: [ 13 | Field( 14 | Field { 15 | label: Some( 16 | ( 17 | Repeated, 18 | 14..22, 19 | ), 20 | ), 21 | name: Ident { 22 | value: "m", 23 | span: 44..45, 24 | }, 25 | kind: Map { 26 | ty_span: 23..43, 27 | key_ty: Sint32, 28 | key_ty_span: 27..33, 29 | value_ty: Fixed64, 30 | value_ty_span: 35..42, 31 | }, 32 | number: Int { 33 | negative: false, 34 | value: 1, 35 | span: 48..49, 36 | }, 37 | options: None, 38 | comments: Comments { 39 | leading_detached_comments: [], 40 | leading_comment: None, 41 | trailing_comment: None, 42 | }, 43 | span: 14..50, 44 | }, 45 | ), 46 | ], 47 | extensions: [], 48 | options: [], 49 | reserved: [], 50 | }, 51 | comments: Comments { 52 | leading_detached_comments: [], 53 | leading_comment: None, 54 | trailing_comment: None, 55 | }, 56 | span: 0..52, 57 | }, 58 | ) 59 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: [] 4 | pull_request: 5 | branches: 6 | - main 7 | 8 | name: Continuous integration 9 | 10 | jobs: 11 | test: 12 | name: Test Suite 13 | runs-on: ubuntu-latest 14 | strategy: 15 | matrix: 16 | rust: [beta, stable, 1.74.0] 17 | steps: 18 | - uses: actions/checkout@v2 19 | with: 20 | submodules: true 21 | - uses: dtolnay/rust-toolchain@v1 22 | with: 23 | toolchain: ${{ matrix.rust }} 24 | # Skip cargo update for MSRV validation build 25 | - run: cargo update 26 | if: ${{ matrix.rust == 'stable' || matrix.rust == 'beta' }} 27 | - name: Install Protoc 28 | uses: arduino/setup-protoc@v1 29 | with: 30 | repo-token: ${{ secrets.GITHUB_TOKEN }} 31 | - run: cargo test 32 | 33 | lints: 34 | name: Lints 35 | runs-on: ubuntu-latest 36 | strategy: 37 | matrix: 38 | rust: 39 | - stable 40 | steps: 41 | - uses: actions/checkout@v2 42 | with: 43 | submodules: true 44 | - uses: dtolnay/rust-toolchain@v1 45 | with: 46 | toolchain: ${{ matrix.rust }} 47 | component: clippy, rustfmt 48 | - run: cargo fmt --all -- --check 49 | - run: cargo clippy -- -D warnings 50 | - run: cargo check --no-default-features 51 | - run: cargo check --all-features 52 | 53 | coverage: 54 | name: Coverage 55 | runs-on: ubuntu-latest 56 | container: 57 | image: xd009642/tarpaulin:develop 58 | options: --security-opt seccomp=unconfined 59 | steps: 60 | - uses: actions/checkout@v2 61 | with: 62 | submodules: true 63 | - name: Install Protoc 64 | uses: arduino/setup-protoc@v1 65 | with: 66 | repo-token: ${{ secrets.GITHUB_TOKEN }} 67 | - name: Generate code coverage 68 | run: | 69 | cargo tarpaulin --verbose --timeout 120 --out xml 70 | - name: Upload to codecov.io 71 | uses: codecov/codecov-action@v4 72 | with: 73 | fail_ci_if_error: true 74 | token: ${{ secrets.CODECOV_TOKEN }} 75 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [ 12 | Option { 13 | body: OptionBody { 14 | name: [ 15 | Ident( 16 | Ident { 17 | value: "bar", 18 | span: 18..21, 19 | }, 20 | ), 21 | ], 22 | value: String( 23 | String { 24 | value: "quz", 25 | span: 24..29, 26 | }, 27 | ), 28 | }, 29 | comments: Comments { 30 | leading_detached_comments: [], 31 | leading_comment: None, 32 | trailing_comment: None, 33 | }, 34 | span: 11..31, 35 | }, 36 | ], 37 | values: [ 38 | EnumValue { 39 | name: Ident { 40 | value: "VAL", 41 | span: 32..35, 42 | }, 43 | number: Int { 44 | negative: true, 45 | value: 1, 46 | span: 38..40, 47 | }, 48 | options: None, 49 | comments: Comments { 50 | leading_detached_comments: [], 51 | leading_comment: None, 52 | trailing_comment: None, 53 | }, 54 | span: 32..41, 55 | }, 56 | ], 57 | reserved: [], 58 | comments: Comments { 59 | leading_detached_comments: [], 60 | leading_comment: None, 61 | trailing_comment: None, 62 | }, 63 | span: 0..43, 64 | }, 65 | ) 66 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [ 13 | Method { 14 | name: Ident { 15 | value: "bar", 16 | span: 18..21, 17 | }, 18 | input_ty: TypeName { 19 | leading_dot: None, 20 | name: FullIdent { 21 | parts: [ 22 | Ident { 23 | value: "A", 24 | span: 22..23, 25 | }, 26 | ], 27 | }, 28 | }, 29 | output_ty: TypeName { 30 | leading_dot: None, 31 | name: FullIdent { 32 | parts: [ 33 | Ident { 34 | value: "B", 35 | span: 34..35, 36 | }, 37 | Ident { 38 | value: "C", 39 | span: 36..37, 40 | }, 41 | ], 42 | }, 43 | }, 44 | options: [], 45 | client_streaming: None, 46 | server_streaming: None, 47 | comments: Comments { 48 | leading_detached_comments: [], 49 | leading_comment: None, 50 | trailing_comment: None, 51 | }, 52 | span: 14..39, 53 | }, 54 | ], 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 0..41, 61 | }, 62 | ) 63 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [ 13 | Method { 14 | name: Ident { 15 | value: "bar", 16 | span: 18..21, 17 | }, 18 | input_ty: TypeName { 19 | leading_dot: None, 20 | name: FullIdent { 21 | parts: [ 22 | Ident { 23 | value: "A", 24 | span: 22..23, 25 | }, 26 | ], 27 | }, 28 | }, 29 | output_ty: TypeName { 30 | leading_dot: None, 31 | name: FullIdent { 32 | parts: [ 33 | Ident { 34 | value: "B", 35 | span: 34..35, 36 | }, 37 | Ident { 38 | value: "C", 39 | span: 36..37, 40 | }, 41 | ], 42 | }, 43 | }, 44 | options: [], 45 | client_streaming: None, 46 | server_streaming: None, 47 | comments: Comments { 48 | leading_detached_comments: [], 49 | leading_comment: None, 50 | trailing_comment: None, 51 | }, 52 | span: 14..42, 53 | }, 54 | ], 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 0..44, 61 | }, 62 | ) 63 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [ 13 | Method { 14 | name: Ident { 15 | value: "bar", 16 | span: 18..21, 17 | }, 18 | input_ty: TypeName { 19 | leading_dot: None, 20 | name: FullIdent { 21 | parts: [ 22 | Ident { 23 | value: "A", 24 | span: 22..23, 25 | }, 26 | ], 27 | }, 28 | }, 29 | output_ty: TypeName { 30 | leading_dot: None, 31 | name: FullIdent { 32 | parts: [ 33 | Ident { 34 | value: "B", 35 | span: 34..35, 36 | }, 37 | Ident { 38 | value: "C", 39 | span: 36..37, 40 | }, 41 | ], 42 | }, 43 | }, 44 | options: [], 45 | client_streaming: None, 46 | server_streaming: None, 47 | comments: Comments { 48 | leading_detached_comments: [], 49 | leading_comment: None, 50 | trailing_comment: None, 51 | }, 52 | span: 14..46, 53 | }, 54 | ], 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 0..48, 61 | }, 62 | ) 63 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-16.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 0..8, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "name", 15 | span: 15..19, 16 | }, 17 | kind: Normal { 18 | ty: Int32, 19 | ty_span: 9..14, 20 | }, 21 | number: Int { 22 | negative: false, 23 | value: 5, 24 | span: 22..23, 25 | }, 26 | options: Some( 27 | OptionList { 28 | options: [ 29 | OptionBody { 30 | name: [ 31 | Extension( 32 | TypeName { 33 | leading_dot: None, 34 | name: FullIdent { 35 | parts: [ 36 | Ident { 37 | value: "ext", 38 | span: 26..29, 39 | }, 40 | ], 41 | }, 42 | }, 43 | 25..30, 44 | ), 45 | ], 46 | value: String( 47 | String { 48 | value: "foo", 49 | span: 33..38, 50 | }, 51 | ), 52 | }, 53 | ], 54 | span: 24..39, 55 | }, 56 | ), 57 | comments: Comments { 58 | leading_detached_comments: [], 59 | leading_comment: None, 60 | trailing_comment: None, 61 | }, 62 | span: 0..40, 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_enum-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Enum { 7 | name: Ident { 8 | value: "Foo", 9 | span: 5..8, 10 | }, 11 | options: [], 12 | values: [ 13 | EnumValue { 14 | name: Ident { 15 | value: "BAR", 16 | span: 11..14, 17 | }, 18 | number: Int { 19 | negative: false, 20 | value: 0, 21 | span: 17..18, 22 | }, 23 | options: Some( 24 | OptionList { 25 | options: [ 26 | OptionBody { 27 | name: [ 28 | Ident( 29 | Ident { 30 | value: "opt", 31 | span: 20..23, 32 | }, 33 | ), 34 | ], 35 | value: Float( 36 | Float { 37 | value: 0.5, 38 | span: 26..29, 39 | }, 40 | ), 41 | }, 42 | ], 43 | span: 19..30, 44 | }, 45 | ), 46 | comments: Comments { 47 | leading_detached_comments: [], 48 | leading_comment: None, 49 | trailing_comment: None, 50 | }, 51 | span: 11..31, 52 | }, 53 | ], 54 | reserved: [], 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 0..33, 61 | }, 62 | ) 63 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__imports-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"import weak 'foo.proto';\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [ 12 | "foo.proto", 13 | ], 14 | public_dependency: [], 15 | weak_dependency: [ 16 | 0, 17 | ], 18 | message_type: [], 19 | enum_type: [], 20 | service: [], 21 | extension: [], 22 | options: None, 23 | source_code_info: Some( 24 | SourceCodeInfo { 25 | location: [ 26 | Location { 27 | path: [], 28 | span: [ 29 | 0, 30 | 0, 31 | 24, 32 | ], 33 | leading_comments: None, 34 | trailing_comments: None, 35 | leading_detached_comments: [], 36 | }, 37 | Location { 38 | path: [ 39 | 3, 40 | 0, 41 | ], 42 | span: [ 43 | 0, 44 | 0, 45 | 24, 46 | ], 47 | leading_comments: None, 48 | trailing_comments: None, 49 | leading_detached_comments: [], 50 | }, 51 | Location { 52 | path: [ 53 | 11, 54 | 0, 55 | ], 56 | span: [ 57 | 0, 58 | 7, 59 | 11, 60 | ], 61 | leading_comments: None, 62 | trailing_comments: None, 63 | leading_detached_comments: [], 64 | }, 65 | ], 66 | }, 67 | ), 68 | syntax: None, 69 | }, 70 | ) 71 | -------------------------------------------------------------------------------- /protox-parse/src/snapshots/protox_parse__tests__imports-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: protox-parse/src/tests.rs 3 | expression: "parse(\"import public 'foo.proto';\")" 4 | --- 5 | Ok( 6 | FileDescriptorProto { 7 | name: Some( 8 | "test.proto", 9 | ), 10 | package: None, 11 | dependency: [ 12 | "foo.proto", 13 | ], 14 | public_dependency: [ 15 | 0, 16 | ], 17 | weak_dependency: [], 18 | message_type: [], 19 | enum_type: [], 20 | service: [], 21 | extension: [], 22 | options: None, 23 | source_code_info: Some( 24 | SourceCodeInfo { 25 | location: [ 26 | Location { 27 | path: [], 28 | span: [ 29 | 0, 30 | 0, 31 | 26, 32 | ], 33 | leading_comments: None, 34 | trailing_comments: None, 35 | leading_detached_comments: [], 36 | }, 37 | Location { 38 | path: [ 39 | 3, 40 | 0, 41 | ], 42 | span: [ 43 | 0, 44 | 0, 45 | 26, 46 | ], 47 | leading_comments: None, 48 | trailing_comments: None, 49 | leading_detached_comments: [], 50 | }, 51 | Location { 52 | path: [ 53 | 10, 54 | 0, 55 | ], 56 | span: [ 57 | 0, 58 | 7, 59 | 13, 60 | ], 61 | leading_comments: None, 62 | trailing_comments: None, 63 | leading_detached_comments: [], 64 | }, 65 | ], 66 | }, 67 | ), 68 | syntax: None, 69 | }, 70 | ) 71 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-24.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [ 13 | Method { 14 | name: Ident { 15 | value: "bar", 16 | span: 18..21, 17 | }, 18 | input_ty: TypeName { 19 | leading_dot: None, 20 | name: FullIdent { 21 | parts: [ 22 | Ident { 23 | value: "stream", 24 | span: 29..35, 25 | }, 26 | ], 27 | }, 28 | }, 29 | output_ty: TypeName { 30 | leading_dot: None, 31 | name: FullIdent { 32 | parts: [ 33 | Ident { 34 | value: "stream", 35 | span: 53..59, 36 | }, 37 | Ident { 38 | value: "stream", 39 | span: 60..66, 40 | }, 41 | ], 42 | }, 43 | }, 44 | options: [], 45 | client_streaming: Some( 46 | 22..28, 47 | ), 48 | server_streaming: Some( 49 | 46..52, 50 | ), 51 | comments: Comments { 52 | leading_detached_comments: [], 53 | leading_comment: None, 54 | trailing_comment: None, 55 | }, 56 | span: 14..68, 57 | }, 58 | ], 59 | comments: Comments { 60 | leading_detached_comments: [], 61 | leading_comment: None, 62 | trailing_comment: None, 63 | }, 64 | span: 0..70, 65 | }, 66 | ) 67 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_message-13.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Message { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | body: MessageBody { 12 | items: [ 13 | Field( 14 | Field { 15 | label: None, 16 | name: Ident { 17 | value: "foo", 18 | span: 22..25, 19 | }, 20 | kind: Normal { 21 | ty: Named( 22 | TypeName { 23 | leading_dot: None, 24 | name: FullIdent { 25 | parts: [ 26 | Ident { 27 | value: "service", 28 | span: 14..21, 29 | }, 30 | ], 31 | }, 32 | }, 33 | ), 34 | ty_span: 14..21, 35 | }, 36 | number: Int { 37 | negative: false, 38 | value: 1, 39 | span: 28..29, 40 | }, 41 | options: None, 42 | comments: Comments { 43 | leading_detached_comments: [], 44 | leading_comment: None, 45 | trailing_comment: None, 46 | }, 47 | span: 14..30, 48 | }, 49 | ), 50 | ], 51 | extensions: [], 52 | options: [], 53 | reserved: [], 54 | }, 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 0..32, 61 | }, 62 | ) 63 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_service-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_service() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Service { 7 | name: Ident { 8 | value: "Foo", 9 | span: 8..11, 10 | }, 11 | options: [], 12 | methods: [ 13 | Method { 14 | name: Ident { 15 | value: "bar", 16 | span: 18..21, 17 | }, 18 | input_ty: TypeName { 19 | leading_dot: Some( 20 | 29..30, 21 | ), 22 | name: FullIdent { 23 | parts: [ 24 | Ident { 25 | value: "A", 26 | span: 30..31, 27 | }, 28 | Ident { 29 | value: "B", 30 | span: 32..33, 31 | }, 32 | ], 33 | }, 34 | }, 35 | output_ty: TypeName { 36 | leading_dot: Some( 37 | 51..52, 38 | ), 39 | name: FullIdent { 40 | parts: [ 41 | Ident { 42 | value: "C", 43 | span: 52..53, 44 | }, 45 | ], 46 | }, 47 | }, 48 | options: [], 49 | client_streaming: Some( 50 | 22..28, 51 | ), 52 | server_streaming: Some( 53 | 44..50, 54 | ), 55 | comments: Comments { 56 | leading_detached_comments: [], 57 | leading_comment: None, 58 | trailing_comment: None, 59 | }, 60 | span: 14..55, 61 | }, 62 | ], 63 | comments: Comments { 64 | leading_detached_comments: [], 65 | leading_comment: None, 66 | trailing_comment: None, 67 | }, 68 | span: 0..57, 69 | }, 70 | ) 71 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_group-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "match parser.parse_field() {\n Ok(value) => Ok(value),\n Err(()) => Err(parser.lexer.extras.errors),\n}" 4 | --- 5 | Ok( 6 | Field { 7 | label: Some( 8 | ( 9 | Optional, 10 | 0..8, 11 | ), 12 | ), 13 | name: Ident { 14 | value: "A", 15 | span: 15..16, 16 | }, 17 | kind: Group { 18 | ty_span: 9..14, 19 | body: MessageBody { 20 | items: [ 21 | Field( 22 | Field { 23 | label: Some( 24 | ( 25 | Optional, 26 | 23..31, 27 | ), 28 | ), 29 | name: Ident { 30 | value: "foo", 31 | span: 39..42, 32 | }, 33 | kind: Normal { 34 | ty: Sint32, 35 | ty_span: 32..38, 36 | }, 37 | number: Int { 38 | negative: false, 39 | value: 2, 40 | span: 45..46, 41 | }, 42 | options: None, 43 | comments: Comments { 44 | leading_detached_comments: [], 45 | leading_comment: None, 46 | trailing_comment: None, 47 | }, 48 | span: 23..47, 49 | }, 50 | ), 51 | ], 52 | extensions: [], 53 | options: [], 54 | reserved: [], 55 | }, 56 | }, 57 | number: Int { 58 | negative: false, 59 | value: 1, 60 | span: 19..20, 61 | }, 62 | options: None, 63 | comments: Comments { 64 | leading_detached_comments: [], 65 | leading_comment: None, 66 | trailing_comment: None, 67 | }, 68 | span: 0..49, 69 | }, 70 | ) 71 | -------------------------------------------------------------------------------- /protox-parse/src/parse/snapshots/protox_parse__parse__tests__parse_field-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/parse/tests.rs 3 | expression: "if parser.lexer.extras.errors.is_empty() {\n Ok(result.unwrap())\n } else { Err(parser.lexer.extras.errors) }" 4 | --- 5 | Ok( 6 | Field { 7 | label: None, 8 | name: Ident { 9 | value: "name", 10 | span: 17..21, 11 | }, 12 | kind: Map { 13 | ty_span: 0..16, 14 | key_ty: Int32, 15 | key_ty_span: 4..9, 16 | value_ty: Bool, 17 | value_ty_span: 11..15, 18 | }, 19 | number: Int { 20 | negative: false, 21 | value: 5, 22 | span: 24..25, 23 | }, 24 | options: Some( 25 | OptionList { 26 | options: [ 27 | OptionBody { 28 | name: [ 29 | Ident( 30 | Ident { 31 | value: "opt", 32 | span: 27..30, 33 | }, 34 | ), 35 | ], 36 | value: Ident { 37 | negative: false, 38 | ident: Ident { 39 | value: "true", 40 | span: 33..37, 41 | }, 42 | span: 33..37, 43 | }, 44 | }, 45 | OptionBody { 46 | name: [ 47 | Ident( 48 | Ident { 49 | value: "opt2", 50 | span: 39..43, 51 | }, 52 | ), 53 | ], 54 | value: Float( 55 | Float { 56 | value: 4.5, 57 | span: 46..49, 58 | }, 59 | ), 60 | }, 61 | ], 62 | span: 26..50, 63 | }, 64 | ), 65 | comments: Comments { 66 | leading_detached_comments: [], 67 | leading_comment: None, 68 | trailing_comment: None, 69 | }, 70 | span: 0..51, 71 | }, 72 | ) 73 | -------------------------------------------------------------------------------- /protox-parse/src/generate/lines.rs: -------------------------------------------------------------------------------- 1 | use crate::{index_to_i32, Span}; 2 | 3 | #[derive(Debug, Clone)] 4 | pub(crate) struct LineResolver { 5 | lines: Vec, 6 | } 7 | 8 | impl LineResolver { 9 | pub fn new(source_code: &str) -> Self { 10 | let lines = source_code 11 | .match_indices('\n') 12 | .map(|(index, _)| index_to_i32(index + 1)) 13 | .collect(); 14 | LineResolver { lines } 15 | } 16 | 17 | pub fn resolve(&self, offset: usize) -> (i32, i32) { 18 | match self.lines.binary_search(&index_to_i32(offset)) { 19 | Ok(index) => (index_to_i32(index + 1), 0), 20 | Err(0) => (0, index_to_i32(offset)), 21 | Err(index) => ( 22 | index_to_i32(index), 23 | index_to_i32(offset) - self.lines[index - 1], 24 | ), 25 | } 26 | } 27 | 28 | pub fn resolve_span(&self, span: Span) -> Vec { 29 | let (start_line, start_col) = self.resolve(span.start); 30 | let (end_line, end_col) = self.resolve(span.end); 31 | 32 | if start_line == end_line { 33 | vec![start_line, start_col, end_col] 34 | } else { 35 | vec![start_line, start_col, end_line, end_col] 36 | } 37 | } 38 | } 39 | 40 | #[test] 41 | fn resolve_line_number() { 42 | let resolver = LineResolver::new("hello\nworld\nfoo"); 43 | 44 | assert_eq!(resolver.resolve(0), (0, 0)); 45 | assert_eq!(resolver.resolve(4), (0, 4)); 46 | assert_eq!(resolver.resolve(5), (0, 5)); 47 | assert_eq!(resolver.resolve(6), (1, 0)); 48 | assert_eq!(resolver.resolve(7), (1, 1)); 49 | assert_eq!(resolver.resolve(10), (1, 4)); 50 | assert_eq!(resolver.resolve(11), (1, 5)); 51 | assert_eq!(resolver.resolve(12), (2, 0)); 52 | assert_eq!(resolver.resolve(13), (2, 1)); 53 | assert_eq!(resolver.resolve(14), (2, 2)); 54 | assert_eq!(resolver.resolve(15), (2, 3)); 55 | 56 | let resolver = LineResolver::new("f\n\noo\r\nbar"); 57 | 58 | assert_eq!(resolver.resolve(0), (0, 0)); 59 | assert_eq!(resolver.resolve(1), (0, 1)); 60 | assert_eq!(resolver.resolve(2), (1, 0)); 61 | assert_eq!(resolver.resolve(3), (2, 0)); 62 | assert_eq!(resolver.resolve(4), (2, 1)); 63 | assert_eq!(resolver.resolve(5), (2, 2)); 64 | assert_eq!(resolver.resolve(6), (2, 3)); 65 | assert_eq!(resolver.resolve(7), (3, 0)); 66 | assert_eq!(resolver.resolve(8), (3, 1)); 67 | assert_eq!(resolver.resolve(9), (3, 2)); 68 | assert_eq!(resolver.resolve(10), (3, 3)); 69 | } 70 | --------------------------------------------------------------------------------