Skip to main content

proto_blue_syntax/
lib.rs

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