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
//! Rust access library to read/write iChen® 4 Open Protocol™ messages.
//!
//! Details on the protocol can be found in [this document].
//!
//! Design Notes
//! ============
//!
//! Beware that all data types defined in this crate use borrowed string slices (i.e. `&str`) extensively.
//! This is because the most common usage pattern is to create a data variable, set fields, immediately
//! serialize it into JSON, then dispose of the data variable.  The deserialization story is similar.
//!
//! Error values also borrow heavily from the input fields as these errors are expected to be handled
//! as soon as possible.
//!
//! The result is minimal allocations and copying, but at the cost of stricter lifetime management,
//! especially when deserializing -- the message struct cannot out-live the original JSON text string as
//! fields are borrowed extensively from the original JSON string.
//!
//! Another implication due to extensive usage of borrowed string slices is that string literals with
//! escape sequences will cause parsing errors because the actual string cannot be simply borrowed from
//! the original JSON string.  Luckily this is extremely rare for most fields holding names, ID's etc.
//! For this reason, only certain user-defined text fields (such as `job_card_id`) may contain
//! escaped characters (especially the double-quote); those are therefore modeled using `Cow<&str>` instead.
//!
//! [this document]: https://github.com/chenhsong/OpenProtocol/blob/master/cs/doc/messages_reference.md
//!

#![doc(html_logo_url = "https://chenhsong.github.io/iChen/images/ichen_40_logo_small.png")]
#![doc(html_root_url = "https://docs.rs/ichen-openprotocol")]

// Modules
mod controller;
mod error;
mod filters;
mod messages;
mod types;
mod utils;

/// Result type.
pub type Result<'a, T> = std::result::Result<T, OpenProtocolError<'a>>;

type ValidationResult = Result<'static, ()>;
type BoundedValidationResult<'a> = Result<'a, ()>;

// Re-exports
pub use controller::{Controller, GeoLocation, Operator};
pub use error::OpenProtocolError;
pub use filters::Filters;
pub use messages::*;
pub use types::{JobMode, Language, OpMode, ID};