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
//! The `Record` trait — the abstraction every appview uses to treat
//! one record kind in a family the same as the next.
//!
//! Every record type in [`crate::generated`] implements `Record` via
//! a blanket impl emitted by `idiolect-codegen`. Appview indexers,
//! xrpc handlers, and test fixtures can then be generic over `R:
//! Record` instead of matching on NSIDs by hand.
//!
//! The companion `AnyRecord` enum, `decode_record` function, and
//! `IdiolectFamily` marker type live in
//! [`crate::generated::family`] — they are codegen output, with one
//! variant per record-type lexicon. Adding a record type to the
//! family is a one-line lexicon change. The trait everything
//! parameterises over is [`crate::family::RecordFamily`]; the
//! `dev.idiolect.*` family is one implementor of it, on equal
//! footing with any downstream-curated family
//! (`pub.layers.*`, dialect bundles, etc.).
use ;
use crateNsid;
/// Every `dev.idiolect.*` record type implements this trait.
///
/// The generated `impl` block supplies the [`NSID`][Record::NSID]
/// constant and constrains the associated serde bounds. Appview code
/// written against `Record` works for any new record type added to
/// the lexicon family without touching call sites.
///
/// # Examples
///
/// ```
/// use idiolect_records::{Encounter, Record};
/// assert_eq!(Encounter::NSID, "dev.idiolect.encounter");
/// ```
/// Errors produced by [`crate::decode_record`].