atproto-extras
Extra utilities for AT Protocol applications, including rich text facet parsing.
Features
- Facet Parsing: Extract mentions (
@handle), URLs, and hashtags (#tag) from plain text with correct UTF-8 byte offset calculation - Identity Integration: Resolve mention handles to DIDs during parsing
Installation
Add to your Cargo.toml:
[]
= "0.13"
Usage
Parsing Text for Facets
use ;
use FacetFeature;
let text = "Check out https://example.com #rust";
// Parse URLs and tags - returns Vec<Facet> directly
let url_facets = parse_urls;
let tag_facets = parse_tags;
// Each facet includes byte positions and typed features
for facet in url_facets
for facet in tag_facets
Parsing Mentions
Mention parsing requires an IdentityResolver to convert handles to DIDs:
use ;
use FacetFeature;
let text = "Hello @alice.bsky.social!";
let limits = default;
// Requires an async context and IdentityResolver
let facets = parse_mentions.await;
for facet in facets
Mentions that cannot be resolved to a valid DID are automatically skipped. Mentions appearing within URLs are also excluded.
Creating AT Protocol Facets
use ;
let text = "Hello @alice.bsky.social! Check https://rust-lang.org #rust";
let limits = default;
// Requires an async context and IdentityResolver
let facets = parse_facets_from_text.await;
if let Some = facets
Byte Offset Handling
AT Protocol facets use UTF-8 byte offsets, not character indices. This is critical for correct handling of multi-byte characters like emojis or non-ASCII text.
use parse_urls;
// Text with emojis (multi-byte UTF-8 characters)
let text = "✨ Check https://example.com ✨";
let facets = parse_urls;
// Byte positions correctly account for the 4-byte emoji
assert_eq!; // After "✨ Check " (4 + 1 + 6 = 11 bytes)
Facet Limits
Use FacetLimits to control the maximum number of facets processed:
use FacetLimits;
// Default limits
let limits = default;
// mentions_max: 5, tags_max: 5, links_max: 5, max: 10
// Custom limits
let custom = FacetLimits ;
License
MIT