Protocol Buffers - Google's data interchange format (grpc依赖) https://developers.google.com/protocol-buffers/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
5.9 KiB

# Protocol Buffers - Google's data interchange format
# Copyright 2022 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
module Google
module Protobuf
class FFI
extend ::FFI::Library
# Workaround for Bazel's use of symlinks + JRuby's __FILE__ and `caller`
# that resolves them.
if ENV['BAZEL'] == 'true'
ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi', ENV['PWD']
else
ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi'
end
## Map
Upb_Map_Begin = -1
## Encoding Status
Upb_Status_MaxMessage = 127
Upb_Encode_Deterministic = 1
Upb_Encode_SkipUnknown = 2
## JSON Encoding options
# When set, emits 0/default values. TODO: proto3 only?
Upb_JsonEncode_EmitDefaults = 1
# When set, use normal (snake_case) field names instead of JSON (camelCase) names.
Upb_JsonEncode_UseProtoNames = 2
# When set, emits enums as their integer values instead of as their names.
Upb_JsonEncode_FormatEnumsAsIntegers = 4
## JSON Decoding options
Upb_JsonDecode_IgnoreUnknown = 1
typedef :pointer, :Array
typedef :pointer, :DefPool
typedef :pointer, :EnumValueDef
typedef :pointer, :ExtensionRegistry
typedef :pointer, :FieldDefPointer
typedef :pointer, :FileDef
typedef :pointer, :FileDescriptorProto
typedef :pointer, :Map
typedef :pointer, :Message # Instances of a message
typedef :pointer, :OneofDefPointer
typedef :pointer, :binary_string
if ::FFI::Platform::ARCH == "aarch64"
typedef :u_int8_t, :uint8_t
typedef :u_int16_t, :uint16_t
typedef :u_int32_t, :uint32_t
typedef :u_int64_t, :uint64_t
end
FieldType = enum(
:double, 1,
:float,
:int64,
:uint64,
:int32,
:fixed64,
:fixed32,
:bool,
:string,
:group,
:message,
:bytes,
:uint32,
:enum,
:sfixed32,
:sfixed64,
:sint32,
:sint64
)
CType = enum(
:bool, 1,
:float,
:int32,
:uint32,
:enum,
:message,
:double,
:int64,
:uint64,
:string,
:bytes
)
Label = enum(
:optional, 1,
:required,
:repeated
)
Syntax = enum(
:Proto2, 2,
:Proto3
)
# All the different kind of well known type messages. For simplicity of check,
# number wrappers and string wrappers are grouped together. Make sure the
# order and merber of these groups are not changed.
WellKnown = enum(
:Unspecified,
:Any,
:FieldMask,
:Duration,
:Timestamp,
# number wrappers
:DoubleValue,
:FloatValue,
:Int64Value,
:UInt64Value,
:Int32Value,
:UInt32Value,
# string wrappers
:StringValue,
:BytesValue,
:BoolValue,
:Value,
:ListValue,
:Struct
)
DecodeStatus = enum(
:Ok,
:Malformed, # Wire format was corrupt
:OutOfMemory, # Arena alloc failed
:BadUtf8, # String field had bad UTF-8
:MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
# CheckRequired failed, but the parse otherwise succeeded.
:MissingRequired,
)
EncodeStatus = enum(
:Ok,
:OutOfMemory, # Arena alloc failed
:MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
# CheckRequired failed, but the parse otherwise succeeded.
:MissingRequired,
)
class StringView < ::FFI::Struct
layout :data, :pointer,
:size, :size_t
end
class MiniTable < ::FFI::Struct
layout :subs, :pointer,
:fields, :pointer,
:size, :uint16_t,
:field_count, :uint16_t,
:ext, :uint8_t, # upb_ExtMode, declared as uint8_t so sizeof(ext) == 1
:dense_below, :uint8_t,
:table_mask, :uint8_t,
:required_count, :uint8_t # Required fields have the lowest hasbits.
# To statically initialize the tables of variable length, we need a flexible
# array member, and we need to compile in gnu99 mode (constant initialization
# of flexible array members is a GNU extension, not in C99 unfortunately. */
# _upb_FastTable_Entry fasttable[];
end
class Status < ::FFI::Struct
layout :ok, :bool,
:msg, [:char, Upb_Status_MaxMessage]
def initialize
super
FFI.clear self
end
end
class MessageValue < ::FFI::Union
layout :bool_val, :bool,
:float_val, :float,
:double_val, :double,
:int32_val, :int32_t,
:int64_val, :int64_t,
:uint32_val, :uint32_t,
:uint64_val,:uint64_t,
:map_val, :pointer,
:msg_val, :pointer,
:array_val,:pointer,
:str_val, StringView
end
class MutableMessageValue < ::FFI::Union
layout :map, :Map,
:msg, :Message,
:array, :Array
end
# Status
attach_function :clear, :upb_Status_Clear, [Status.by_ref], :void
attach_function :error_message, :upb_Status_ErrorMessage, [Status.by_ref], :string
# Generic
attach_function :memcmp, [:pointer, :pointer, :size_t], :int
attach_function :memcpy, [:pointer, :pointer, :size_t], :int
# Alternatives to pre-processor macros
def self.decode_max_depth(i)
i << 16
end
end
end
end