summaryrefslogtreecommitdiff
path: root/docs/transient-0.md
blob: 67632d6d75eff0e39d301bb1910e7142fe6c4c97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# transient-0

transient-0 is a binary encoding of hobgoblin data is for transient data where
forwards and backwards compatibility is not required, such as IPC between
different instances of the same program.

The encoder and decoder must use the same version of hobgoblin and the same data
definitions for decoding to succeed.

transient-0 does not support:
* Compatibility between different versions of hobgoblin. The exact encoding is
  an implementation detail that may change between any two versions of
  hobgoblin.
* Compatibility between different data definitions. For instance, if a field is
  added to a struct, there is no guarantee that data encoded before the field
  was added can be decoded using the new data definition.

## Encoding

This describes the current encoding of transient-0.

* `Bool`: a one-byte integer where true and false are represented by
  1 and 0 respectively.

* `Int32`: a four-byte little endian integer.

* `Int64`: an eight-byte little endian integer.

* `String`: the length of the UTF-8 encoding of the string written as per
  `Int64`, followed by that UTF-8 encoding.

* `Option[T]`: if `none`, encoded as per `false`, otherwise encoded as per
  `true` followed by the encoding of the value as per `T`.

* `List[T]`: the number of elements in the list encoded as per `Int64`, followed
  by each of the elements in the list encoded as per `T`.

* `Shared[T]`: the first time a value is encountered, encoded as a unique ID as
  per `Int64` followed by the encoding of the value itself as per `T`.

  Any subsequent times that value is encountered, encoded as the unique ID as
  per `Int64`.

  Shared values should be assigned incremental IDs starting at zero. That is,
  the first shared value should have an ID of 0, the second shared value should
  have an ID of 1, and so on.

* A struct is encoded by encoding each of its fields in definition order.

* An enum is encoded by the index of the variant as per `Int32`.

* A sum is encoded by the index of the variant as per `Int32` followed by the
  encoding as per the type of the variant.