proto_blue_syntax/lib.rs
1#![cfg_attr(test, allow(clippy::pedantic, clippy::nursery))]
2
3//! AT Protocol identifier types with validation.
4//!
5//! Provides validated newtypes for all AT Protocol identifiers:
6//! DID, Handle, NSID, AT-URI, TID, `RecordKey`, Datetime, and `AtIdentifier`.
7//!
8//! # Examples
9//!
10//! ```
11//! use proto_blue_syntax::{Did, Handle, Nsid, AtUri, Tid, RecordKey};
12//!
13//! // Parse and validate a DID
14//! let did = Did::new("did:plc:z72i7hdynmk6r22z27h6tvur").unwrap();
15//! assert_eq!(did.method(), "plc");
16//!
17//! // Parse a handle
18//! let handle = Handle::new("alice.bsky.social").unwrap();
19//! assert_eq!(handle.to_string(), "alice.bsky.social");
20//!
21//! // Parse an NSID
22//! let nsid = Nsid::new("app.bsky.feed.post").unwrap();
23//! assert_eq!(nsid.authority(), "app.bsky.feed");
24//! assert_eq!(nsid.name(), "post");
25//!
26//! // Parse an AT-URI
27//! let uri = AtUri::new("at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/abc123").unwrap();
28//! assert_eq!(uri.collection(), Some("app.bsky.feed.post"));
29//! assert_eq!(uri.rkey(), Some("abc123"));
30//!
31//! // Generate a TID from a timestamp
32//! let tid = Tid::from_timestamp(1704067200_000_000, 0);
33//! assert_eq!(tid.to_string().len(), 13);
34//!
35//! // Validate a record key
36//! let rkey = RecordKey::new("self").unwrap();
37//! assert!(RecordKey::new(".").is_err()); // "." is not allowed
38//! ```
39
40mod at_identifier;
41mod aturi;
42mod datetime;
43mod did;
44mod handle;
45mod language;
46mod nsid;
47mod recordkey;
48mod tid;
49mod uri;
50
51pub use at_identifier::{AtIdentifier, InvalidAtIdentifierError};
52pub use aturi::{AtUri, InvalidAtUriError};
53pub use datetime::{Datetime, InvalidDatetimeError, current_datetime_string, normalize_datetime};
54pub use did::{Did, InvalidDidError};
55pub use handle::{
56 DISALLOWED_TLDS, HANDLE_INVALID, Handle, InvalidHandleError, is_valid_tld,
57 normalize_and_ensure_valid_handle, normalize_handle,
58};
59pub use language::is_valid_language;
60pub use nsid::{InvalidNsidError, Nsid};
61pub use recordkey::{InvalidRecordKeyError, RecordKey};
62pub use tid::{InvalidTidError, Tid};
63pub use uri::is_valid_uri;