An open API service indexing awesome lists of open source software.

https://github.com/xoreaxlmbdx/fson

Flexible Serialized Object Notation
https://github.com/xoreaxlmbdx/fson

cargo format fson javascript js json object rust wasm

Last synced: 3 months ago
JSON representation

Flexible Serialized Object Notation

Awesome Lists containing this project

README

          

# fson

**FSON** _(Flexible Serialized Object Notation)_ is an extension for JSON that
is used primarily for configuration. The user can quickly configure the
configuration using [**references**](#features) or a
[**template strings**](#features).

# Features

## Comments and new values

```
/* Multiline comment */ [null, NaN, Infinity, -Infinity, 0x1ABC /*Hexadecimal*/] // Single comment
```

## Identifiers

- You can use identifiers without quotes and with single quotes:

```
{
"double quotes": null,
'single quotes': null,
withoutQuotes: null
}
```

## References

- A **reference** is an object **that can be anywhere (it can be either a pair
of an object or it can be in an array)** that can be referenced using it's
identifier or path. For example:

```
{
something: {
key: #{ #id: "identifier"; #value: "value"; }
}
}
```

- The **reference** in the example above can be referenced in two ways:
- Using it's identifier: `#identifier` or `#"identifier"`
- Using it's path: `#/something/identifier` or `#/"something"/"identifier"`

## Template strings

- **Template strings** are strings enclosed in backticks. They allow you to
embed other values **(including [references](#references))** in them using
`${value}`. For example:
```
{
x: 5,
something: `x is ${x}`
}
```

## Other

- Objects and arrays can have a trailing comma: `{ x: { y: [], }, }`
- Numbers can start with a plus: `+1.5`
- Strings can be multiline:

```
"hello
world"
```

- Whitespaces don't matter

# Examples

See all examples in [Examples](examples) directory.
How to run example:
`cargo run --example EXAMPLE_NAME`

# Compiling to WebAssembly

**FSON** is already ready for compilation to **WebAssembly** and already has the
necessary functions. `js-sys` and `wasm-bindgen` libraries and functions are
used only when compiling to **WebAssembly**.
Use these commands to compile
to wasm:

```
# Install wasm-pack
cargo install wasm-pack

# Compile to wasm
wasm-pack build --target web
```

JavaScript example

```js
import init, { parse, stringify } from "./jsonparser.js";
init().then(() => {
console.log(stringify({
// Creating reference
x: {
"#id": "test",
"#value": "value",
},

// Using reference
y: [
// Identifier
{ "#reference_id": "test" },

// Path
{ "#reference_path": ["x"] },

// Template string
{
"@template_string": [
"test is ",
{ "#reference_id": "test" }, /* Reference */
"; 2 + 2 = ",
4, /* Normal value */
],
},
],
}));
});
```

# License

MIT