4 releases
0.1.3 | Jun 16, 2021 |
---|---|
0.1.2 | Sep 23, 2020 |
0.1.1 | Sep 22, 2020 |
0.1.0 | Sep 8, 2020 |
#2295 in Parser implementations
Used in 3 crates
(via ogma-libs)
93KB
2.5K
SLoC
Natural Language Structured Document
Natural Language Structured Documents or NLSDs for short are English representations of serializable/deserializable data. The purpose of such a document is to make equal the understanding of data and the data itself. This is important for example when users sign off on data (e.g. with a cryptographic signature) that the presentation of the data itself is what they are signing.
An NLSD attempts to represent the following data and datatypes
Null
Boolean
Number
String
List
Map
NamedList
NamedMap
Enum
Null
empty | nothing
Boolean
true | false | on | off | enabled | disabled
Number
0.0
String
`string`
Strings need to escape ``` with ```
List
the [empty] (list|`variant`) [henceforth `name`] [where an item is ___] [and another item [of `name`] is ___]
When deserializing variant if present will get converted into UpperCamelCase
Map
the [empty] (object|`variant`) [henceforth `name`] [where [the] `key` is ___] [and [the] `key` [of `name`] is ___]
Note the key
will replaced with snake_case
when parsing for easier mapping.
Notice the the
is optional when building out key/value pairs. When serializing the the
will always be placed unless the key
begins with is
denoting an adjective (e.g. "is_enabled")
Enum (New Type Variant)
the `type` which is ___
Names
Names are important when deserializing nested structures. The 'name'
must be in scope when deserializing in order to associate the object with its parent. When searching for a 'name'
the deserializer will walk up the tree to find the name. When the 'name'
is found the new scope is set to that level in the tree. If no 'name'
is provided the current scope
When serializing an object to NLSD, henceforth 'name'
will be added unless the object is the leaf of the tree, and of 'name'
will be added to keys/items unless the scope referred to is a parent of the current scope
default name for or a list item
[parent name] item [index number]
default name for a struct or map item
[parent name] [key]
where the root name is 'the list' for a list, 'the object' for an object and the struct name for a struct
Examples
User
struct User {
id: u32,
public_key: String,
}
let user = User { id: 1, public_key: "A7sg..." };
the `user` where the `id` is 1 and the `public key` is `A7sg...`
Transactions
struct Transaction {
from: String,
to: String,
amount: f64
}
let transactions = vec![
Transaction { from: "address1", to: "address2", amount: 10.2 },
Transaction { from: "address2", to: "address3", amount: 5.8 },
];
the list henceforth `the list` where an item is the `transaction` where the `from` is `address1` and the `to` is `address2` and the `amount` is 10.2 and another item of `the list` is the `transaction` where the `from` is `address2` and the `to` is `address3` and the `amount` is 5.8
Dependencies
~195–480KB