Expand description

Logo by Misiasart
Thanks to all individual and corporate sponsors, without whom this work could not exist:
facet provides reflection for Rust: it gives types a SHAPE
associated
const with details on the layout, fields, doc comments, attributes, etc.
It can be used for many things, from (de)serialization to pretty-printing, rich debuggers, CLI parsing, reflection in templating engines, code generation, etc.
See https://facet.rs for details.
§Known issues and limitations
We have the occasional soundness issue, see the soundness tag. Those are prioritized and fixed as soon as possible.
Format crates like facet-json
are still very much incomplete, and will
probably always be slower than the serde-*
equivalent. Reflection has
advantages in terms of flexibility, ergonomics and compile time but has
a runtime cost compared to “monomorphize all the things”.
(Note: with codegen, one could get the best of both worlds. To be researched more)
Some format crates (like facet-toml
) first deserialize to a DOM, and then
to partial structs — this is not as efficient as it could be, but it’s a good
first step.
Rust 1.86.0 has a compile error if you just import Facet but don’t use it, see https://github.com/facet-rs/facet/issues/75. This is fixed in nightly and will no longer be a problem with the next major Rust version.
type_eq
is not const, thus preventing many useful things in const fn
, see
https://github.com/facet-rs/facet/issues/98. Language changes are needed
to address that.
The design of arbitrary attributes is still in flux, see:
- https://github.com/facet-rs/facet/issues/108#issue-2986732759
- https://github.com/facet-rs/facet/issues/151#issuecomment-2820476301
There isn’t a comparison between facet-reflect and bevy-reflect available right now— this is by design. We’re letting facet develop on its own for a while; we’ll make a detailed comparison once things have settled.
There are more issues and limitations of course, but this should get you started.
§Ecosystem
The core crates, facet-trait
, facet-types
etc. are no_std-friendly.
The main facet
crate re-exports symbols from:
- facet-core, which defines the main components:
- The
Facet
trait and implementations for foreign types (mostlylibstd
) - The
Shape
struct along with various vtables and the wholeDef
tree - Type-erased pointer helpers like
PtrUninit
,PtrConst
, andOpaque
- Autoderef specialization trick needed for
facet-derive
- The
- facet-derive, which implements the
Facet
derive attribute as a fast/light proc macro powered by unsynn
For struct manipulation and reflection, the following is available:
- facet-reflect, allows building values of arbitrary shapes in safe code, respecting invariants. It also allows peeking at existing values.
- facet-pretty is able to pretty-print Facet types.
facet supports deserialization from multiple data formats through dedicated crates:
- facet-json: JSON deserialization
- facet-yaml: YAML deserialization
- facet-toml: TOML deserialization
- facet-msgpack: MessagePack deserialization
- facet-urlencoded: URL-encoded form data deserialization
- facet-args: CLI arguments (a-la clap)
Internal crates include:
- facet-codegen is internal and generates some of the code of
facet-core
- facet-testhelpers a simpler log logger and color-backtrace configured with the lightweight btparse backend
§License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Re-exports§
pub use static_assertions;
Modules§
- hacking
- Hacking Guide to Facet
- sample_
generated_ code - This defines a few types showcasing various features of the Facet derive macro.
- spez
- Auto-deref specialization helpers for the Facet reflection system
Macros§
- debug
- Forwards to log::debug when the log feature is enabled
- trace
- Forwards to log::trace when the log feature is enabled
- value_
vtable - Creates a
ValueVTable
for a given type.
Structs§
- Array
Def - Fields for array types
- Array
DefBuilder - Builder for ArrayDef
- ArrayV
Table - Virtual table for a list-like type (like
Vec<T>
, but alsoHashSet<T>
, etc.) - ArrayV
Table Builder - Builds a
ArrayVTable
- Bool
Affinity - Definition for boolean scalar affinities
- Bool
Affinity Builder - Builder for BoolAffinity
- Char
Affinity - Definition for character scalar affinities
- Char
Affinity Builder - Builder for CharAffinity
- Complex
Number Affinity - Definition for string-like scalar affinities
- Complex
Number Affinity Builder - Builder for ComplexNumberAffinity
- Const
Type Id - TypeId equivalent usable in const contexts.
- Empty
Affinity - Definition for empty scalar affinities
- Empty
Affinity Builder - Builder for EmptyAffinity
- EnumDef
- Fields for enum types
- Enum
DefBuilder - Builder for EnumDef
- Field
- Describes a field in a struct or tuple
- Field
Builder - Builder for Field
- Field
Flags - Flags that can be applied to fields to modify their behavior
- FieldV
Table - Vtable for field-specific operations
- FieldV
Table Builder - Builder for FieldVTable
- Frame
- Represents a frame in the initialization stack
- Frame
Flags - Flags that can be applied to frames
- Function
Pointer Def - Common fields for function pointer types
- Function
Pointer DefBuilder - Builder for FunctionPointerDef
- Guard
- A guard structure to manage memory allocation and deallocation.
- Hasher
Proxy - Provides an implementation of
core::hash::Hasher
for a given hasher pointer and write function - Heap
Value - A type-erased value stored on the heap
- ISet
- Keeps track of which fields were initialized, up to 64 fields
- IpAddr
Affinity - Definition for IP address scalar affinities
- IpAddr
Affinity Builder - Builder for IpAddrAffinity
- ListDef
- Fields for list types
- List
DefBuilder - Builder for ListDef
- ListV
Table - Virtual table for a list-like type (like
Vec<T>
, but alsoHashSet<T>
, etc.) - ListV
Table Builder - Builds a
ListVTable
- Lock
GuardV Table - Functions for manipulating a guard
- Lock
Result - Type-erased result of locking a mutex-like smart pointer
- MapDef
- Fields for map types
- MapDef
Builder - Builder for MapDef
- MapIterV
Table - VTable for an iterator over a map
- MapIterV
Table Builder - Builds a
MapIterVTable
- MapV
Table - Virtual table for a Map<K, V>
- MapV
Table Builder - Builds a
MapVTable
- Marker
Traits - Bitflags for common marker traits that a type may implement
- Number
Affinity - Definition for number-like scalar affinities
- Number
Affinity Builder - Builder for NumberAffinity
- Opaque
- Helper type for opaque members
- Opaque
Affinity - Definition for opaque scalar affinities
- Opaque
Affinity Builder - Builder for OpaqueAffinity
- Option
Def - Describes an Option — including a vtable to query and alter its state,
and the inner shape (the
T
inOption<T>
). - Option
DefBuilder - Builder for OptionDef
- OptionV
Table - Virtual table for
Option<T>
- OptionV
Table Builder - Builds an
OptionVTable
- Other
Affinity - Definition for other scalar affinities
- Other
Affinity Builder - Builder for OtherAffinity
- Path
Affinity - Definition for path scalar affinities
- Path
Affinity Builder - Builder for PathAffinity
- Peek
- Lets you read from a value (implements read-only
ValueVTable
proxies) - Peek
Enum - Lets you read from an enum (implements read-only enum operations)
- Peek
List - Lets you read from a list (implements read-only
facet_core::ListVTable
proxies) - Peek
List Iter - Iterator over a
PeekList
- PeekMap
- Lets you read from a map (implements read-only
facet_core::MapVTable
proxies) - Peek
MapIter - Iterator over key-value pairs in a
PeekMap
- Peek
Option - Lets you read from an option (implements read-only option operations)
- Peek
Smart Pointer - Represents a smart pointer that can be peeked at during memory inspection.
- Peek
Struct - Lets you read from a struct (implements read-only struct operations)
- PtrConst
- A type-erased read-only pointer to an initialized value.
- PtrMut
- A type-erased pointer to an initialized value
- PtrUninit
- A type-erased pointer to an uninitialized value
- Scalar
Def - Definition for scalar types
- Scalar
DefBuilder - Builder for ScalarDef
- Shape
- Schema for reflection of a type
- Shape
Builder - Builder for
Shape
- Slice
Def - Fields for slice types
- Slice
DefBuilder - Builder for SliceDef
- SliceV
Table - Virtual table for a slice-like type (like
Vec<T>
, but alsoHashSet<T>
, etc.) - SliceV
Table Builder - Builds a
SliceVTable
- Smart
Pointer Def - Describes a smart pointer — including a vtable to query and alter its state, and the inner shape (the pointee type in the smart pointer).
- Smart
Pointer DefBuilder - Builder for creating a
SmartPointerDef
. - Smart
Pointer Flags - Flags to represent various characteristics of smart pointers
- Smart
PointerV Table - Functions for interacting with a smart pointer
- Smart
PointerV Table Builder - Builder for creating a
SmartPointerVTable
. - Socket
Addr Affinity - Definition for socket address scalar affinities
- Socket
Addr Affinity Builder - Builder for SocketAddrAffinity
- String
Affinity - Definition for string-like scalar affinities
- String
Affinity Builder - Builder for StringAffinity
- Struct
Builder - Builder for StructDef
- Struct
Def - Common fields for struct-like types
- Time
Affinity - Definition for Datetime/Timestamp scalar affinities
- Time
Affinity Builder - Builder for UuidAffinity
- Type
Name Opts - Options for formatting the name of a type
- Type
Param - Represents a lifetime parameter, e.g.,
'a
or'a: 'b + 'c
. - Typed
PtrUninit - A pointer to an uninitialized value with a lifetime.
- Ulid
Affinity - Definition for ULID and ULID-like scalar affinities
- Ulid
Affinity Builder - Builder for UlidAffinity
- Unsized
Error - Tried to get the
Layout
of an unsized type - Uuid
Affinity - Definition for UUID and UUID-like scalar affinities
- Uuid
Affinity Builder - Builder for UuidAffinity
- VTable
View - A typed view of a
ValueVTable
. - ValueId
- A unique identifier for a peek value
- ValueV
Table - VTable for common operations that can be performed on any shape
- ValueV
Table Builder - Builds a
ValueVTable
- Variant
- Describes a variant of an enum
- Variant
Builder - Builder for Variant
- Wip
- A work-in-progress heap-allocated value
Enums§
- Characteristic
- A characteristic a shape can have
- Def
- The definition of a shape: is it more like a struct, a map, a list?
- Enum
Repr - All possible representations for Rust enums — ie. the type/size of the discriminant
- Field
Attribute - An attribute that can be set on a field
- Field
Error - Errors encountered when calling
field_by_index
orfield_by_name
- Frame
Mode - Represents the special mode a frame can be in
- Function
Abi - The calling ABI of a function pointer
- Known
Smart Pointer - Represents common standard library smart pointer kinds
- Number
Bits - Bit representation of numbers
- Parse
Error - Error returned by
ParseFn
- Reflect
Error - Errors that can occur when reflecting on types.
- Scalar
Affinity - Scalar affinity: what a scalar spiritually is: a number, a string, a bool, something else entirely?
- Scalar
Type - All scalar types supported out of the box by peek and poke.
- Shape
Attribute - An attribute that can be applied to a shape
- Shape
Layout - Layout of the shape
- Signedness
- Represents whether a numeric type is signed or unsigned
- Struct
Kind - Describes the kind of struct (useful for deserializing)
- TryBorrow
Inner Error - Error type returned by
TryBorrowInnerFn
when attempting to borrow the inner value from a wrapper type. - TryFrom
Error - Error type for TryFrom conversion failures
- TryInto
Inner Error - Error type returned by
TryIntoInnerFn
when attempting to extract the inner value from a wrapper type. - Variant
Attribute - An attribute that can be set on an enum variant
Traits§
- Facet
- Allows querying the
Shape
of a type, which in turn lets us inspect any fields, build a value of this type progressively, etc. - HasFields
- Trait for types that have field methods
Functions§
- of
- Create a
TypeId
for a type. - peek_
enum - Returns the enum definition if the shape represents an enum, None otherwise
- peek_
enum_ repr - Returns the enum representation if the shape represents an enum, None otherwise
- peek_
enum_ variants - Returns the enum variants if the shape represents an enum, None otherwise
Type Aliases§
- Array
GetItem PtrFn - Get pointer to the item at the given index. Panics if out of bounds.
- Borrow
Fn - Tries to obtain a reference to the inner value of the smart pointer.
- Clone
Into Fn - Function to clone a value into another already-allocated value
- Clone
Into FnTyped - Function to clone a value into another already-allocated value
- CmpFn
- Function to compare two values and return their ordering
- CmpFn
Typed - Function to compare two values and return their ordering
- DebugFn
- Function to format a value for debug. If this returns None, the shape did not implement Debug.
- Debug
FnTyped - Function to format a value for debug. If this returns None, the shape did not implement Debug.
- Default
InPlace Fn - Function to set a value to its default in-place
- Default
InPlace FnTyped - Function to set a value to its default in-place
- Display
Fn - Function to format a value for display
- Display
FnTyped - Function to format a value for display
- Downgrade
Into Fn - Downgrades a strong pointer to a weak one.
- Drop
InPlace Fn - Function to drop a value
- HashFn
- Function to hash a value
- Hash
FnTyped - Function to hash a value
- Hasher
Write Fn - Function to write bytes to a hasher
- Hasher
Write FnTyped - Function to write bytes to a hasher
- Invariants
Fn - Function to validate the invariants of a value. If it returns false, the value is considered invalid.
- Invariants
FnTyped - Function to validate the invariants of a value. If it returns false, the value is considered invalid.
- List
GetItem PtrFn - Get pointer to the item at the given index. Panics if out of bounds.
- List
Init InPlace With Capacity Fn - Initialize a list in place with a given capacity
- List
LenFn - Get the number of items in the list
- List
Push Fn - Push an item to the list
- LockFn
- Acquires a lock on a mutex-like smart pointer
- MapContains
KeyFn - Check if the map contains a key
- MapGet
Value PtrFn - Get pointer to a value for a given key, returns None if not found
- MapInit
InPlace With Capacity Fn - Initialize a map in place with a given capacity
- MapInsert
Fn - Insert a key-value pair into the map
- MapIter
Dealloc Fn - Deallocate the iterator
- MapIter
Fn - Get an iterator over the map
- MapIter
Next Fn - Get the next key-value pair from the iterator
- MapLen
Fn - Get the number of entries in the map
- NewInto
Fn - Creates a new smart pointer wrapping the given value.
- Option
GetValue Fn - Get the value contained in an option, if present
- Option
Init None Fn - Initialize an option with None
- Option
Init Some Fn - Initialize an option with Some(value)
- Option
IsSome Fn - Check if an option contains a value
- Option
Replace With Fn - Replace an existing option with a new value
- ParseFn
- Function to parse a value from a string.
- Parse
FnTyped - Function to parse a value from a string.
- Partial
EqFn - Function to check if two values are partially equal
- Partial
EqFn Typed - Function to check if two values are partially equal
- Partial
OrdFn - Function to compare two values and return their ordering if comparable
- Partial
OrdFn Typed - Function to compare two values and return their ordering if comparable
- ReadFn
- Acquires a read lock on a reader-writer lock-like smart pointer
- Skip
Serializing IfFn - A function that, if present, determines whether field should be included in the serialization step.
- Slice
GetItem PtrFn - Get pointer to the item at the given index. Panics if out of bounds.
- Slice
LenFn - Get the number of items in the slice
- TryBorrow
Inner Fn - Function to borrow the inner value from a transparent/newtype wrapper without copying.
- TryBorrow
Inner FnTyped - Function to borrow the inner value from a transparent/newtype wrapper without copying.
- TryFrom
Fn - Function to try converting from another type
- TryFrom
FnTyped - Function to try converting from another type
- TryInto
Inner Fn - Function to convert a transparent/newtype wrapper into its inner type.
- TryInto
Inner FnTyped - Function to convert a transparent/newtype wrapper into its inner type.
- Type
Name Fn - A function that formats the name of a type.
- Upgrade
Into Fn - Tries to upgrade the weak pointer to a strong one.
- WriteFn
- Acquires a write lock on a reader-writer lock-like smart pointer
Derive Macros§
- Facet
- Derive the Facet trait for structs, tuple structs, and enums.