pub struct Capabilities(/* private fields */);Expand description
A wrapper around Vec<Capability> that controls how capabilities are
serialized and built.
Serialization is a single comma-separated string (e.g. "/:rw,/pub/my-cool-app/:r"),
which is convenient for logs, URLs, or compact text payloads. It also comes
with a fluent builder (Capabilities::builder()).
Note: this does not remove length prefixes in binary encodings; if you need a varint-free trailing field in a custom binary format, implement a bespoke encoder/decoder instead of serde.
Implementations§
Source§impl Capabilities
impl Capabilities
Sourcepub fn normalize(self) -> Self
pub fn normalize(self) -> Self
Return a normalized capability list.
Normalization merges duplicate scopes, de-duplicates and sorts actions, and removes capabilities already covered by broader capabilities.
§Examples
use pubky_common::capabilities::{Capability, Capabilities};
let caps = Capabilities::from(vec![
Capability::read("/pub/").unwrap(),
Capability::write("/pub/").unwrap(),
Capability::read("/pub/file.txt").unwrap(),
]);
assert_eq!(caps.normalize().to_string(), "/pub/:rw");Sourcepub fn contains(&self, capability: &Capability) -> bool
pub fn contains(&self, capability: &Capability) -> bool
Returns true if the list contains capability.
Sourcepub fn iter(&self) -> Iter<'_, Capability> ⓘ
pub fn iter(&self) -> Iter<'_, Capability> ⓘ
Returns an iterator over the slice of Capability.
Sourcepub fn builder() -> CapsBuilder
pub fn builder() -> CapsBuilder
Start a fluent builder for multiple capabilities.
use pubky_common::capabilities::Capabilities;
let caps = Capabilities::builder().read_write("/").unwrap().finish();
assert_eq!(caps.to_string(), "/:rw");Sourcepub fn try_from_caps_url(url: &Url) -> Result<Self, CapabilitiesParseError>
pub fn try_from_caps_url(url: &Url) -> Result<Self, CapabilitiesParseError>
Parse capabilities from the caps query parameter of url.
Expects a comma-separated list of capability strings, e.g.:
?caps=/pub/my-cool-app/:rw,/foo:r
§Examples
let url = Url::parse("https://example/app?caps=/pub/my-cool-app/:rw,/foo:r").unwrap();
let caps = Capabilities::try_from_caps_url(&url).unwrap();
assert!(!caps.is_empty());Sourcepub fn as_slice(&self) -> &[Capability]
pub fn as_slice(&self) -> &[Capability]
Borrow the inner capabilities as a slice without allocating.
Constant-time; returns a view into the existing buffer.
§Examples
use pubky_common::capabilities::{Capability, Capabilities};
let caps = Capabilities::from(vec![
Capability::read("/foo").unwrap(),
Capability::write("/bar/").unwrap(),
]);
let slice: &[Capability] = caps.as_slice();
assert_eq!(slice.len(), 2);Sourcepub fn to_vec(&self) -> Vec<Capability>
pub fn to_vec(&self) -> Vec<Capability>
Clone the inner capability list.
Trait Implementations§
Source§impl Clone for Capabilities
impl Clone for Capabilities
Source§fn clone(&self) -> Capabilities
fn clone(&self) -> Capabilities
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more