stick-and-string 1.1.2

SAS 1.1 (Stick And String) — human-readable data serialization format. Parser, validator, and bidirectional JSON converter.
Documentation
# stick-and-string (Rust)

Rust implementation of the SAS 1.1 (Stick And String) data format.  
Zero dependencies. Parser, validator, and bidirectional JSON converter.

## Install

Add to `Cargo.toml`:

```toml
[dependencies]
stick-and-string = "1.1.0"
```

## Quick Start

```rust
use sas::{parse, to_json, from_json, ToJsonOptions, FromJsonOptions, Value};

// Parse SAS → Value
let doc = r#"
server ::
    host -> "localhost"
    port -> 8080
    tags -> ["api" | "v2"]
:: server
"#;

let val = parse(doc)?;
if let Value::Object(root) = &val {
    if let Some(Value::Object(server)) = root.get("server") {
        println!("{:?}", server.get("host")); // Some(String("localhost"))
        println!("{:?}", server.get("port")); // Some(Int(8080))
    }
}

// SAS → JSON string
let json = to_json(doc, ToJsonOptions::default())?;

// JSON string → SAS string
let sas = from_json(&json, FromJsonOptions::default())?;
```

## Error Handling

```rust
use sas::{parse, ParseError};

match parse("name -> \"Alice\"\nname -> \"Bob\"\n") {
    Ok(_)  => println!("valid"),
    Err(e) => eprintln!("Line {}: {}", e.line, e.message),
    // Line 2: E01: Duplicate key "name"
}
```

## Value Type

```rust
pub enum Value {
    Null,
    Bool(bool),
    Int(i64),
    Float(f64),
    String(String),
    Array(Vec<Value>),
    Object(Object),   // insertion-order preserving
}
```

`Object` exposes:
- `obj.get(key) -> Option<&Value>`
- `obj.keys: Vec<String>` (insertion order)
- `obj.iter()` — yields `(&str, &Value)` in insertion order

## API

```rust
// Parsing
pub fn parse(source: &str) -> Result<Value, ParseError>;

// SAS → JSON
pub fn to_json(source: &str, opts: ToJsonOptions) -> Result<String, ParseError>;

// JSON → SAS
pub fn from_json(json_src: &str, opts: FromJsonOptions) -> Result<String, ConvertError>;

// Options
pub struct ToJsonOptions   { pub indent: String, pub strip_version: bool }
pub struct FromJsonOptions { pub version_header: bool, pub indent: String }
```

## CLI

```bash
# Install
cargo install stick-and-string

# Use
sas validate  config.sas
sas to-json   config.sas
sas to-json   config.sas --compact
sas to-sas    data.json  --output data.sas
sas roundtrip config.sas
```

## Running Tests

```bash
cargo test
```

## License

Copyright (c) 2025 Sourasish Das  
Licensed under the Vexon Open-Control License (VOCL) 1.0 — see LICENSE.