| Crates.io | aslan |
| lib.rs | aslan |
| version | 0.1.0 |
| created_at | 2026-01-17 17:06:40.056756+00 |
| updated_at | 2026-01-17 17:06:40.056756+00 |
| description | Parser for ASLAN markup language |
| homepage | |
| repository | https://github.com/jayfoss/ASLAN |
| max_upload_size | |
| id | 2050783 |
| size | 134,360 |
A streaming parser for ASLAN (ASLAN Sufficiently Lax AI Notation) - an LLM stream compatible structured data format.
See the full specification in the main repository.
Add this to your Cargo.toml:
[dependencies]
aslan = "0.1.0"
use aslan::ASLANParser;
let mut parser = ASLANParser::new();
let result = parser.parse("[asland_greeting]Hello [asland_name]World!");
// Result is a serde_json::Value:
// {
// "_default": null,
// "greeting": "Hello ",
// "name": "World!"
// }
parse_nextASLAN is designed for streaming LLM outputs. Use parse_next to feed tokens incrementally:
use aslan::ASLANParser;
let mut parser = ASLANParser::new();
// Simulate streaming tokens from an LLM
parser.parse_next("[asland_");
parser.parse_next("response]");
parser.parse_next("Here is ");
parser.parse_next("the answer.");
parser.close();
let result = parser.get_result();
Subscribe to events for real-time processing:
use aslan::ASLANParser;
let mut parser = ASLANParser::new();
// Listen for content updates
parser.add_content_listener(|event| {
println!("Field: {}, Content: {}", event.field_name, event.content);
});
// Listen for field completions
parser.add_end_listener(|event| {
println!("Completed: {} = {}", event.field_name, event.content);
});
parser.parse("[asland_msg]Hello!");
use aslan::ASLANParser;
let mut parser = ASLANParser::new();
// Objects
let result = parser.parse(
"[asland_user][aslano][asland_name]Alice[asland_age]30"
);
// { "user": { "name": "Alice", "age": "30" } }
// Arrays
let mut parser = ASLANParser::new();
let result = parser.parse(
"[asland_items][aslana][asland]Apple[asland]Banana[asland]Cherry"
);
// { "items": ["Apple", "Banana", "Cherry"] }
use aslan::{ASLANParser, ASLANParserSettings};
let mut parser = ASLANParser::with_settings(ASLANParserSettings {
strict_start: true, // Require [aslang] to start parsing
strict_end: true, // Stop parsing at [aslans]
collapse_whitespace: true, // Collapse whitespace at object/array starts
..Default::default()
});
| Suffix | Name | Description |
|---|---|---|
d |
Data | Define a field: [asland_fieldname] |
o |
Object | Start/end object: [aslano] |
a |
Array | Start/end array: [aslana] |
i |
Instruction | Emit event: [aslani_name:arg1:arg2] |
p |
Part | Split into array: [aslanp] |
c |
Comment | Ignore until next delimiter: [aslanc] |
e |
Escape | Escape content: [aslane_ID]...[aslane_ID] |
v |
Void | Null value: [aslanv] |
g |
Go | Start ASLAN (with strict_start): [aslang] |
s |
Stop | Stop ASLAN (with strict_end): [aslans] |
MIT