Skip to main content

AttributeMap

Struct AttributeMap 

Source
pub struct AttributeMap<T> { /* private fields */ }
Expand description

Defines keyed durable values sharing one Attribute name.

Each instance identifies an independent stored value and lock. Add the map definition once to crate::PersistenceSchema, then pass an instance on each access. Slash is prohibited in instance keys because it is a reserved character.

Implementations§

Source§

impl<T> AttributeMap<T>

Source

pub fn new(name: impl Into<String>) -> Self

Defines an unindexed Attribute map with a stable name.

Slash is prohibited because it is a reserved character.

Source

pub fn indexed(self, index: AttributeIndex) -> Self

Enables search indexing for every instance using the selected index type.

Source

pub fn sync_to_attribute_store(self) -> Self

Enables asynchronous latest-state projection for every AttributeMap instance.

Each instance maps by its physical Attribute name. The Flow must select a server-configured stores with FlowConfig::attribute_store_names. Deletions project SQL NULL, and projection failures never roll back Flow Attribute writes.

Source

pub fn hard_delete_on_null(self) -> Self
where T: 'static,

Stores every instance’s values only in the Dex blob store and permanently deletes an instance’s stored value when that instance is deleted or set to null.

Use this option for keyed short-lived secrets, such as one API key per tenant. Each instance has its own stored value. Dex never writes instance values into Flow history. Self::delete and a write whose value encodes to null permanently delete the instance’s stored value. The instance then reads as absent. Handlers and Attribute reads receive values inline. The SDK never stores them in the local BlobCache.

Only string and object values, including bytes, are supported. Numeric and Boolean values are rejected. This option cannot be combined with Self::indexed or Self::sync_to_attribute_store. Client::wait_for_attribute_map_instance_match rejects it before it contacts Dex. Action and Action permission conditions cannot read it. Writes require a Server with an enabled blob store and protocol version 3 or later. Each instance key keeps one stored copy, and later writes overwrite it in place.

Supported values, restrictions, Server requirements, and limitations are otherwise the same as for Attribute::hard_delete_on_null. Read that method before storing secrets.

§Examples
use dex_sdk::{AttributeMap, Context, HandlerResult, PersistenceSchema, StartFlowOptions};
use std::sync::LazyLock;

static TENANT_API_KEYS: LazyLock<AttributeMap<String>> =
    LazyLock::new(|| AttributeMap::new("tenant-api-keys").hard_delete_on_null());

let schema = PersistenceSchema::new().attribute_map(&TENANT_API_KEYS);
let options = StartFlowOptions::new().initial_attribute_map(
    &TENANT_API_KEYS,
    "tenant-1",
    "key-1".to_owned(),
);

// The Step or RPC must load the instance before reading it.
fn revoke_tenant_api_key(context: &mut Context, tenant: &str) -> HandlerResult<()> {
    if TENANT_API_KEYS.get(context, tenant)?.is_some() {
        TENANT_API_KEYS.delete(context, tenant)?;
    }
    Ok(())
}
Source

pub fn load(&self, instance: impl Into<String>) -> AttributeMapLoad

Selects one slash-free map instance for loading into a handler Context.

The instance remains readable for the handler even when it is absent; absence is returned as None. Load the map definition when the RPC must enumerate every instance.

Source

pub fn get(&self, context: &Context, instance: &str) -> HandlerResult<Option<T>>
where T: Value,

Reads one instance, returning Ok(None) when it is absent.

§Errors

Returns HandlerError when the payload cannot be decoded.

Source

pub fn get_required( &self, context: &Context, instance: &str, ) -> HandlerResult<T>
where T: Value,

Reads one instance and treats absence as an error.

§Errors

Returns HandlerError when the instance is missing or cannot be decoded.

Source

pub fn set( &self, context: &mut Context, instance: &str, value: T, ) -> HandlerResult<()>
where T: Value,

Stages one instance value for durable persistence.

§Errors

Returns HandlerError when the value cannot be encoded or indexed.

Source

pub fn delete(&self, context: &mut Context, instance: &str) -> HandlerResult<()>

Stages deletion of one instance; missing instances are valid.

Source

pub fn map_size(&self, context: &Context) -> HandlerResult<usize>

Returns the effective number of instances, including buffered writes.

Source

pub fn all_instance_keys(&self, context: &Context) -> HandlerResult<Vec<String>>

Returns decoded effective instance keys in ascending string order.

Source

pub fn lock(&self, instance: impl Into<String>) -> AttributeLock

Creates a lock request scoped to one map instance.

Trait Implementations§

Source§

impl<T> Clone for AttributeMap<T>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<T> Freeze for AttributeMap<T>
where PhantomData<fn() -> T>: Freeze,

§

impl<T> RefUnwindSafe for AttributeMap<T>
where PhantomData<fn() -> T>: RefUnwindSafe,

§

impl<T> Send for AttributeMap<T>
where PhantomData<fn() -> T>: Send,

§

impl<T> Sync for AttributeMap<T>
where PhantomData<fn() -> T>: Sync,

§

impl<T> Unpin for AttributeMap<T>
where PhantomData<fn() -> T>: Unpin,

§

impl<T> UnsafeUnpin for AttributeMap<T>
where PhantomData<fn() -> T>: UnsafeUnpin,

§

impl<T> UnwindSafe for AttributeMap<T>
where PhantomData<fn() -> T>: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more