Changes
1 changed files (+134/-0)
-
-
@@ -12,3 +12,137 @@ //// === // // Zig API. //! MOO message is a message format used for communicating with Roon Server. //! Encodes to and decodes from newline-delimited UTF-8 encoded plain text, like HTTP. //! Newline character is LF (0xa) without CR character. //! //! MOO message consists of metadata, header and body: header is a list of key-values //! that both key and value contains UTF-8 string value, and body is single UTF-8 string. //! Typical MOO message have "Content-Type" header that describes how the message's body //! is encoded. (e.g. "application/json") //! The first line of MOO message is metadata line, which is in "MOO/VERSION VERB SERVICE" //! format. SERVICE is delimited by slash. const std = @import("std"); pub const Parser = struct { state: State = .before_metadata, position: usize = 0, buffer: []const u8, content_type: ?[]const u8 = null, content_length: ?usize = null, const State = enum { before_metadata, before_header, in_header, before_body, done, }; }; /// Metadata contains a MOO message's version and semantics. /// Fields point to the source message bytes: freeing the source message bytes then /// accessing fields results in use-after-free. pub const Metadata = struct { /// Message schema version described in metadata line. version: u32 = 1, /// Verb described in metadata line. Verb consists of uppercase alphabets. /// @example: "REQUEST", "COMPLETE" verb: []const u8, /// Service name described in metadata line. service: []const u8, pub const ParseError = error{ BufferTooShort, }; pub fn init(parser: Parser) ParseError!@This() { _ = parser; @panic("Not implemented"); } }; /// WellKnownFieldsHeader contains header fields appears in the official roon-node-api /// source code. /// Fields point to the source message bytes: freeing the source message bytes then /// accessing fields results in use-after-free. pub const WellKnownFieldsHeader = struct { /// MIME type. content_type: []const u8, /// Byte size of the body. content_length: usize, /// An ID unique to a connection, which is used for identificating which /// response is for which request. request_id: []const u8, pub const ParseError = error{}; pub fn init(parser: Parser) ParseError!@This() { _ = parser; @panic("Not implemented"); } }; /// HashMapHeader stores header fields as a string hash map. /// Fields point to the source message bytes: freeing the source message bytes then /// accessing fields results in use-after-free. pub const HashMapHeader = struct { allocator: std.mem.Allocator, /// Header key-values. map: std.hash_map.StringHashMap([]const u8), pub const ParseError = error{}; pub fn init(allocator: std.mem.Allocator, parser: Parser) ParseError!@This() { var map = std.hash_map.StringHashMap([]const u8).init(allocator); errdefer map.deinit(); _ = parser; @panic("Not implemented"); } pub fn deinit(self: *@This()) void { self.map.deinit(); self.* = undefined; } }; /// RawBody contains a bytes slice of body section in a MOO message. /// The bytes field points to the source message bytes: freeing the source message bytes /// then accessing the bytes field results in use-after-free. pub const RawBody = struct { bytes: []const u8, pub fn init(parser: Parser) @This() { _ = parser; @panic("Not implemented"); } }; /// JsonBody stores MOO message body as JSON value. User has to provided an expected /// type (schema) as "T". pub fn JsonBody(comptime T: type) type { return struct { allocator: std.mem.Allocator, value: *const T, parsed: std.json.Parsed(T), pub fn init(allocator: std.mem.Allocator, parser: Parser) @This() { _ = allocator; _ = parser; @panic("Not implemented"); } pub fn deinit(self: @This()) void { self.parsed.deinit(); self.* = undefined; } }; }
-