package OpenTelemetry::Proto;
# ABSTRACT: The protobuf definitions for the OpenTelemetry Protocol

our $VERSION = '0.019';

use experimental 'signatures';

use File::Share 'dist_dir';
use Path::Tiny 'path';
use Google::ProtocolBuffers::Dynamic;
use Feature::Compat::Try;

my $g = Google::ProtocolBuffers::Dynamic->new('proto');

my $share = do {
    try { dist_dir 'OpenTelemetry-Exporter-OTLP' }
    catch($e) { 'share' }
};

# Generated with
#
#     find . -name "*.proto" | while read proto; do
#        protoc --experimental_allow_proto3_optional -Iproto -o "$( echo ${proto%%.proto}.pb | sed -re 's/^\.\/proto/share/' )" $proto;
#     done
#
# The order of the list below is important! They are compiled
# in order because later ones depend on earlier ones.
for my $proto (qw(
    opentelemetry/proto/common/v1/common.pb
    opentelemetry/proto/resource/v1/resource.pb
    opentelemetry/proto/trace/v1/trace.pb
    opentelemetry/proto/metrics/v1/metrics.pb
    opentelemetry/proto/logs/v1/logs.pb

    opentelemetry/proto/collector/logs/v1/logs_service.pb
    opentelemetry/proto/collector/metrics/v1/metrics_service.pb
    opentelemetry/proto/collector/trace/v1/trace_service.pb
)) {
    $g->load_serialized_string( path("$share/$proto")->slurp );

    my @parts = split '/', $proto;
    pop @parts;

    $g->map({
        package => join('.', @parts ),
        prefix  => join( '::', map ucfirst, @parts ) =~ s/^Opente/OpenTe/r,
    });
}

# FIXME: This should probably be in a different distribution
#
# Generated with
#
#    cd share/google/rpc
#    wget https://raw.githubusercontent.com/googleapis/googleapis/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/status.proto
#    protoc -o status.pb status.proto
#    rm status.proto
#
$g->load_serialized_string( path("$share/google/rpc/status.pb")->slurp );
$g->map({
    package => 'google.rpc',
    prefix  => 'OTel::Google::RPC',
});

1;