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;
#[macro_use] extern crate bitflags;


pub use error::UclError;
pub use error::UclSchemaError;
pub use parser::Parser;
pub use object::Object;
pub use object::emitter::Emitter;

pub type Result<T> = std::result::Result<T, UclError>;

mod utils;
pub mod error;
pub mod parser;
pub mod object;