93 lines
2.4 KiB
Markdown
93 lines
2.4 KiB
Markdown
|
// minimalist network proto/scheme that resembles a .ini file.
|
||
|
// - rlyeh, public domain
|
||
|
|
||
|
## features
|
||
|
|
||
|
```json
|
||
|
types:
|
||
|
floating
|
||
|
integer
|
||
|
string
|
||
|
|
||
|
signed:
|
||
|
yes/no
|
||
|
|
||
|
sizes:
|
||
|
1,8,12,15,16,24,32,64,...
|
||
|
|
||
|
containers:
|
||
|
lists
|
||
|
maps (can be simulated by using two contiguous lists of keys and values)
|
||
|
|
||
|
blocks:
|
||
|
enum
|
||
|
union (can be extended)
|
||
|
struct (can be extended)
|
||
|
|
||
|
options:
|
||
|
zigzag, decay (double->half), packed, default,
|
||
|
|
||
|
messaging:
|
||
|
numbered fields
|
||
|
optional
|
||
|
required
|
||
|
repeated
|
||
|
extensions
|
||
|
```
|
||
|
|
||
|
## binary format
|
||
|
|
||
|
```ini
|
||
|
[cellsize in bytes:8]
|
||
|
[num key-values:cellsize]
|
||
|
[key id:cellsize][value id:cellsize]
|
||
|
[...]
|
||
|
[num types:cellsize]
|
||
|
[type class:cellsize][num items:cellsize][item1][item2][...]
|
||
|
[...] // would be nice to put strings at the very end, because of their length-variable nature
|
||
|
```
|
||
|
|
||
|
## text format
|
||
|
|
||
|
```ini
|
||
|
// namespace
|
||
|
[[Demo]]
|
||
|
|
||
|
// free-standing options
|
||
|
package = "tutorial"
|
||
|
version = 123
|
||
|
pi = 3.14159
|
||
|
|
||
|
[PhoneType] // enumeration: all members are uppercase + no need for explicit values.
|
||
|
HOME
|
||
|
WORK
|
||
|
OTHER = HOME
|
||
|
MOBILE
|
||
|
|
||
|
[PhoneNumber] // struct: variables never share same field number (1!=2)
|
||
|
1: number = 0 // .field 1, .id number, .value 0, .type Integer
|
||
|
2: phonetype = OTHER? // .field 2, .id phonetype, .value OTHER, .type PhoneType, .optional
|
||
|
|
||
|
[Name] // union: some variables may share a very same field number (1==1)
|
||
|
1: name = "" // .field 1, .id name, .value "", .type String
|
||
|
1: nickname = "" // .field 1, .id nickname, .value "", .type String
|
||
|
|
||
|
[Profile] // struct
|
||
|
1: name = Name... // .field 1, .id name, .type Name, .repeat
|
||
|
2: icon = "guest.png"? // .field 2, .id icon, .type String, .value = "guest.png", .optional
|
||
|
|
||
|
[Contact] // struct
|
||
|
1: person = Profile
|
||
|
2: card_id = 0 bits:15 // .default = 0, .bits = 15
|
||
|
3: email = ""? // email is an optional string located in the third message field that defaults to an empy string
|
||
|
4: phone = PhoneType... // .repeat
|
||
|
5: calls = 0... bits:64 packed // .default = 0, .repeat, .bits = 64, .packed
|
||
|
10..max: // user-defined, reserved extensions
|
||
|
|
||
|
[ContactExt <- Contact] // struct that extends from Contact
|
||
|
1: phone_ext_number = 0?
|
||
|
|
||
|
[AddressBook] // struct
|
||
|
1: contact = ContactExt...
|
||
|
```
|