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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//! # UCL (Universal Configuration Library)
//!
//! This library is parser for UCL files.
//!
//! ## Basic structure
//!
//! UCL provide support for 2 different syntaxes:
//!
//! - JSON
//!
//! ```javascript
//! {
//! "param": "value",
//! "section": {
//! "flag": true,
//! "number": 10000,
//! "subsection": {
//! "hosts": [
//! {
//! "host": "localhost",
//! "port": 9000
//! },
//! {
//! "host": "remotehost",
//! "port": 9090
//! }
//! }
//! }
//! }
//! ```
//!
//! - nginx like UCL
//!
//! ```nginx
//! param = value;
//! section {
//! flag = true;
//! number = 10k;
//! subsection {
//! hosts = {
//! host = "localhost";
//! port = 9000
//! }
//! hosts = {
//! host = "remotehost"
//! port = 9090
//! }
//! }
//! }
//! ```
//!
//! Differences between UCL and JSON:
//!
//! - outmost braces are optional so `{"a": "b"}` is equivalent to `"a": "b"`
//! - quotes on keys and strings are optional
//! - `:` can be replaced with `=` or even skipped for objects
//! - comma can be replaced with semicolon
//! - trailing commas are allowed
//! - automatic array creation - non-unique keys in object are allowed and are automatically
//! converted to arrays
//!
//! ## Parser usage
//!
//! Simple example:
//!
//! ```rust
//! static DOC: &'static str = r#"
//! param = value;
//! section {
//! flag = true;
//! number = 10k;
//! subsection {
//! hosts = {
//! host = "localhost";
//! port = 9000
//! }
//! hosts = {
//! host = "remotehost"
//! port = 9090
//! }
//! }
//! }
//! "#;
//!
//! let parser = libucl::Parser::new();
//! let document = parser.parse(DOC).unwrap();
//!
//! assert_eq!(document.fetch("param").unwrap().as_string(), Some("value".to_string()));
//! ```
extern crate libucl_bind;
extern crate libc;
extern crate bitflags;
pub use UclError;
pub use UclSchemaError;
pub use Parser;
pub use Object;
pub use Emitter;
pub type Result<T> = Result;