Dependencies
{
"deps": {
"mizchi/flatbuffers": "0.1.0"
}
}// Create a FlatBuffer
let builder = @flatbuffers.Builder::new()
// Create a string (must be created before the table)
let name = builder.create_string("Alice")
// Build a table with 2 fields
builder.start_object(2)
builder.add_offset(0, name) // field 0: name (string)
builder.add_int32(1, 30, 0) // field 1: age (int32, default 0)
let person = builder.end_object()
// Finish the buffer
builder.finish(person)
// Get serialized bytes
let bytes = builder.to_bytes()
// Read it back
let buf = @flatbuffers.ByteBuffer::from_bytes(bytes)
let root = @flatbuffers.Table::get_root(buf)
let name = root.get_string(0, "") // "Alice"
let age = root.get_int32(1, 0) // 30// Define schema
let schema = @flatbuffers.TableSchema::new("Person", [
@flatbuffers.FieldDef::new("name", 0, @flatbuffers.FieldType::string()),
@flatbuffers.FieldDef::with_default_int("age", 1, @flatbuffers.FieldType::int32(), 0),
])
// Build using ObjectBuilder
let builder = @flatbuffers.Builder::new()
let obj = @flatbuffers.ObjectBuilder::new(builder, schema)
.set_string("name", "Bob")
obj.start()
ignore(obj.add_int32("age", 25))
obj.finish_buffer()
// Read using ObjectReader
let buf = @flatbuffers.ByteBuffer::new(builder.to_fixed_array())
let root = @flatbuffers.Table::get_root(buf)
let reader = @flatbuffers.ObjectReader::new(root, schema)
println(reader.get_string("name")) // "Bob"
println(reader.get_int32("age")) // 25///|
let schema_text =
#|table Monster {
#| name:string;
#| hp:short = 100;
#|}
///|
let schema = @flatbuffers.parse_schema(schema_text)
///|
let code = @flatbuffers.generate_moonbit(schema)
// Save `code` to a .mbt filemoon run cmd/codegen| Type | Description |
|---|---|
| ByteBuffer | Read-only buffer for deserialization |
| Builder | Mutable builder for serialization |
| Table | Reader for table data |
// Scalars
builder.add_bool(slot, value, default)
builder.add_int8(slot, value, default)
builder.add_uint8(slot, value, default)
builder.add_int16(slot, value, default)
builder.add_uint16(slot, value, default)
builder.add_int32(slot, value, default)
builder.add_uint32(slot, value, default)
builder.add_int64(slot, value, default)
builder.add_uint64(slot, value, default)
builder.add_float32(slot, value, default)
builder.add_float64(slot, value, default)
// Strings and Vectors
builder.create_string(s)
builder.create_shared_string(s) // Deduplicates strings
builder.create_byte_vector(data)
builder.create_int32_vector(data)
// Table construction
builder.start_object(num_fields)
builder.add_offset(slot, offset)
builder.end_object() -> Int
// Finishing
builder.finish(root_offset)
builder.finish_with_identifier(root_offset, "FILE")
builder.finish_size_prefixed(root_offset)// Scalars
table.get_bool(slot, default) -> Bool
table.get_int8(slot, default) -> Int
table.get_int16(slot, default) -> Int
table.get_int32(slot, default) -> Int
table.get_int64(slot, default) -> Int64
table.get_float32(slot, default) -> Float
table.get_float64(slot, default) -> Double
// Strings
table.get_string(slot, default) -> String
// Vectors
table.get_vector_length(slot) -> Int
table.get_vector_byte(slot, index) -> Byte
table.get_vector_int32(slot, index) -> Int
// Nested tables
table.get_table(slot) -> Table?
// Unions
table.get_union_type(slot) -> Int
table.get_union_table(slot) -> Table?///|
let s1 = builder.create_shared_string("repeated")
///|
let s2 = builder.create_shared_string("repeated") // Same offset as s1builder.set_force_defaults(true)
builder.add_int32(0, 0, 0) // Serialized even though value == default///|
let json = @flatbuffers.JsonObjectBuilder::new()
.add_string("name", table.get_string(0, ""))
.add_int("hp", table.get_int32(1, 0))
.to_json_string()
// {"name": "Monster", "hp": 100}let buf = @flatbuffers.ByteBuffer::new(data)
if buf.verify() {
let root = @flatbuffers.Table::get_root(buf)
// Safe to read
}// Create nested buffer
let inner_builder = @flatbuffers.Builder::new()
// ... build inner ...
// Embed in outer buffer
let nested = outer_builder.create_nested_flatbuffer(inner_builder.to_fixed_array())
outer_builder.add_offset(slot, nested)
// Read nested
let nested_root = table.get_nested_root(slot)| Feature | Status |
|---|---|
| Tables | Supported |
| Structs | Supported |
| Enums | Supported |
| Unions | Supported |
| Vectors | Supported |
| Strings | Supported |
| Nested FlatBuffers | Supported |
| Default values | Supported |
| File identifiers | Supported |
| Size-prefixed buffers | Supported |
moon testmoon benchpub enum BaseType {
None
UType
Bool
Byte
UByte
Short
UShort
Int
UInt
Long
ULong
Float
Double
String
Vector
Obj
Union
Array
MaxBaseType
}pub struct ByteBuffer {
data : FixedArray[Byte]
pos : Int
}fn CachedTableReader::get_float64(self : CachedTableReader, field_slot : Int, default : Double) -> Doublefn CachedTableReader::get_string(self : CachedTableReader, field_slot : Int, default : String) -> Stringpub(all) enum ChannelState {
Idle
Connecting
Ready
TransientFailure
Shutdown
}impl Eq for ChannelStateimpl Show for ChannelStatepub struct ClientContext {
metadata : Metadata
response_headers : Metadata
response_trailers : Metadata
options : CallOptions
}pub struct ClientInterceptor {
on_request : (ClientContext, FixedArray[Byte]) -> FixedArray[Byte]
on_response : (ClientContext, FixedArray[Byte]) -> FixedArray[Byte]
}fn ClientInterceptor::new(on_request : (ClientContext, FixedArray[Byte]) -> FixedArray[Byte], on_response : (ClientContext, FixedArray[Byte]) -> FixedArray[Byte]) -> ClientInterceptorpub struct ClientStream[T] {
write_fn : (T) -> Bool
close_fn : () -> Unit
closed : Bool
}pub struct EnumAst {
name : String
base_type : ScalarType
bit_flags : Bool
values : Array[EnumValueAst]
}pub struct FieldAst {
name : String
field_type : FieldTypeAst
default_value : String?
deprecated : Bool
id : Int?
}pub struct FieldDef {
name : String
slot : Int
field_type : FieldType
default_int : Int
default_bool : Bool
}pub enum FieldType {
Bool
Int8
UInt8
Int16
UInt16
Int32
UInt32
Int64
UInt64
Float32
Float64
String
Vector(FieldType)
Table
}pub struct FlatBuffersCodec {
content_type : String
}pub struct FlexRef {
data : FixedArray[Byte]
offset : Int
parent_width : Int
byte_width : Int
flex_type : FlexType
}pub enum FlexType {
Null
Int
UInt
Float
Key
String
IndirectInt
IndirectUInt
IndirectFloat
Map
Vector
VectorInt
VectorUInt
VectorFloat
VectorKey
VectorString
VectorInt2
VectorUInt2
VectorFloat2
VectorInt3
VectorUInt3
VectorFloat3
VectorInt4
VectorUInt4
VectorFloat4
Blob
Bool
VectorBool
}pub struct FlexValue {
flex_type : FlexType
min_bit_width : Int
value_int : Int64
value_uint : UInt64
value_float : Double
offset : Int
}fn GrpcError::with_metadata(status : GrpcStatus, message : String, metadata : Metadata) -> GrpcErrorpub(all) enum GrpcStatus {
Ok
Cancelled
Unknown
InvalidArgument
DeadlineExceeded
NotFound
AlreadyExists
PermissionDenied
ResourceExhausted
FailedPrecondition
Aborted
OutOfRange
Unimplemented
Internal
Unavailable
DataLoss
Unauthenticated
}impl Eq for GrpcStatusimpl Show for GrpcStatusfn HealthService::set_status(self : HealthService, service : String, status : ServingStatus) -> Unitfn JsonObjectBuilder::add_array(self : JsonObjectBuilder, name : String, value : Array[JsonValue]) -> JsonObjectBuilderfn JsonObjectBuilder::add_bool(self : JsonObjectBuilder, name : String, value : Bool) -> JsonObjectBuilderfn JsonObjectBuilder::add_float(self : JsonObjectBuilder, name : String, value : Double) -> JsonObjectBuilderfn JsonObjectBuilder::add_int(self : JsonObjectBuilder, name : String, value : Int) -> JsonObjectBuilderfn JsonObjectBuilder::add_int64(self : JsonObjectBuilder, name : String, value : Int64) -> JsonObjectBuilderfn JsonObjectBuilder::add_object(self : JsonObjectBuilder, name : String, value : JsonObjectBuilder) -> JsonObjectBuilderfn JsonObjectBuilder::add_string(self : JsonObjectBuilder, name : String, value : String) -> JsonObjectBuilderfn JsonObjectBuilder::add_uint(self : JsonObjectBuilder, name : String, value : UInt) -> JsonObjectBuilderfn JsonObjectBuilder::add_uint64(self : JsonObjectBuilder, name : String, value : UInt64) -> JsonObjectBuilderfn JsonObjectBuilder::add_value(self : JsonObjectBuilder, name : String, value : JsonValue) -> JsonObjectBuilderpub struct MessageFrame {
compressed : Bool
length : Int
data : FixedArray[Byte]
}pub struct MethodDescriptor {
service_name : String
method_name : String
method_type : MethodType
full_path : String
}impl Show for MethodDescriptorfn MethodDescriptor::new(service_name : String, method_name : String, method_type : MethodType) -> MethodDescriptorpub(all) enum MethodType {
Unary
ServerStreaming
ClientStreaming
BidirectionalStreaming
}impl Eq for MethodTypeimpl Show for MethodTypepub struct ObjectBuilder {
builder : Builder
schema : TableSchema
string_offsets : Map[String, Int]
vector_offsets : Map[String, Int]
table_offsets : Map[String, Int]
}fn ObjectBuilder::set_int32_vector(self : ObjectBuilder, name : String, values : Array[Int]) -> ObjectBuilderfn ObjectBuilder::set_shared_string(self : ObjectBuilder, name : String, value : String) -> ObjectBuilderfn ObjectBuilder::set_table_offset(self : ObjectBuilder, name : String, offset : Int) -> ObjectBuilderpub enum ScalarType {
Bool
Byte
UByte
Short
UShort
Int
UInt
Long
ULong
Float
Double
}pub struct ServerInterceptor {
on_request : (ServerContext, FixedArray[Byte]) -> FixedArray[Byte]
on_response : (ServerContext, FixedArray[Byte]) -> FixedArray[Byte]
}fn ServerInterceptor::new(on_request : (ServerContext, FixedArray[Byte]) -> FixedArray[Byte], on_response : (ServerContext, FixedArray[Byte]) -> FixedArray[Byte]) -> ServerInterceptorpub struct ServerStream[T] {
read_fn : () -> T?
done : Bool
}impl Show for ServiceDescriptorfn ServiceDescriptor::add_method(self : ServiceDescriptor, desc : MethodDescriptor) -> ServiceDescriptorpub(all) enum ServingStatus {
Unknown
Serving
NotServing
ServiceUnknown
}impl Eq for ServingStatusimpl Show for ServingStatuspub struct VerifierOptions {
max_depth : Int
max_tables : Int
check_alignment : Bool
}fn VerifierOptions::new(max_depth : Int, max_tables : Int, check_alignment : Bool) -> VerifierOptionsDependencies