Registry

Struct Registry 

Source
pub struct Registry<State = Invalid> { /* private fields */ }
Expand description

A collection of signals with their computational dependencies.

The Registry struct serves as the central data structure for managing asset signals. It stores signal definitions indexed by their unique IDs and provides methods for accessing and validating them.

The State type parameter indicates whether the registry has been validated:

§Examples

Creating and validating a registry:

use bothan_lib::registry::{Registry, Invalid, Valid};
use serde_json::json;

// Create a registry from JSON
let json_data = json!({
    "BTC-USD": {
        "sources": [
            {
                "source_id": "binance",
                "id": "btcusdt",
                "routes": []
            }
        ],
        "processor": {
            "function": "median",
            "params": {
                "min_source_count": 1
            }
        },
        "post_processors": []
    }
});

let registry_json = serde_json::to_string(&json_data).unwrap();
let registry: Registry<Invalid> = serde_json::from_str(&registry_json).unwrap();

// Validate the registry
let valid_registry: Registry<Valid> = registry.validate().unwrap();

// Use the validated registry
assert!(valid_registry.contains("BTC-USD"));

Implementations§

Source§

impl Registry<Invalid>

Source

pub fn validate(self) -> Result<Registry<Valid>, ValidationError>

Validates the registry, ensuring all dependencies exist and there are no cycles.

This method performs a thorough validation of the registry, checking that:

  • All signal dependencies (referenced by signal IDs) exist in the registry
  • There are no circular dependencies between signals

If validation is successful, the registry is converted to the Valid state. If validation fails, an error is returned explaining the validation failure.

§Returns
  • Ok(Registry<Valid>) if validation is successful
  • Err(ValidationError) if validation fails
§Examples
use bothan_lib::registry::{Registry, ValidationError};
use serde_json::json;

// Create a valid registry
let valid_json = json!({
    "USDT-USD": {
        "sources": [
            {
                "source_id": "coingecko",
                "id": "tether",
                "routes": []
            }
        ],
        "processor": {
            "function": "median",
            "params": {
                "min_source_count": 1
            }
        },
        "post_processors": []
    }
});

let valid_registry: Registry = serde_json::from_value(valid_json).unwrap();
assert!(valid_registry.validate().is_ok());

// Create an invalid registry with a missing dependency
let invalid_json = json!({
    "BTC-USD": {
        "sources": [
            {
                "source_id": "binance",
                "id": "btcusdt",
                "routes": [
                    {
                        "signal_id": "USDT-USD", // This dependency doesn't exist
                        "operation": "*"
                    }
                ]
            }
        ],
        "processor": {
            "function": "median",
            "params": {
                "min_source_count": 1
            }
        },
        "post_processors": []
    }
});

let invalid_registry: Registry = serde_json::from_value(invalid_json).unwrap();
assert!(invalid_registry.validate().is_err());
Source§

impl<T> Registry<T>

Source

pub fn get(&self, signal_id: &str) -> Option<&Signal>

Returns the signal for a given signal id.

This method retrieves a reference to the Signal with the specified ID, if it exists in the registry.

§Returns
  • Some(&Signal) if the signal exists in the registry
  • None if the signal does not exist
Source

pub fn contains(&self, signal_id: &str) -> bool

Returns true if the registry contains the given signal id.

This method checks whether a signal with the specified ID exists in the registry.

§Returns
  • true if the signal exists in the registry
  • false if the signal does not exist
Source

pub fn signal_ids(&self) -> impl Iterator<Item = &String>

An iterator visiting all signal ids in the registry in arbitrary order.

This method returns an iterator over all signal IDs in the registry. The order of iteration is not specified and may vary between calls.

§Returns

An iterator yielding references to signal IDs

Source

pub fn iter(&self) -> impl Iterator<Item = (&String, &Signal)>

An iterator visiting all the signal ids and their signals in the registry in arbitrary order.

This method returns an iterator over all signal IDs and their corresponding signals in the registry. The order of iteration is not specified and may vary between calls.

§Returns

An iterator yielding pairs of references to signal IDs and their signals

Trait Implementations§

Source§

impl<State: Clone> Clone for Registry<State>

Source§

fn clone(&self) -> Registry<State>

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<State: Debug> Debug for Registry<State>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<Context> Decode<Context> for Registry<Invalid>

Source§

fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError>

Decodes a registry from binary serialization.

This implementation enables efficient binary deserialization of the registry using the bincode crate. It decodes the inner map of signals and creates an invalid registry that must be validated before use.

§Errors

Returns a DecodeError if decoding fails

Source§

impl Default for Registry<Valid>

Source§

fn default() -> Self

Creates a new empty validated registry.

This method creates a default validated registry, which is empty. This is useful as a starting point for building a registry programmatically.

§Returns

An empty Registry<Valid>

Source§

impl<'de, State> Deserialize<'de> for Registry<State>

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<State> Encode for Registry<State>

Source§

fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError>

Encodes the registry for binary serialization.

This implementation enables efficient binary serialization of the registry using the bincode crate. It encodes the inner map of signals.

§Errors

Returns an EncodeError if encoding fails

Source§

impl<State: PartialEq> PartialEq for Registry<State>

Source§

fn eq(&self, other: &Registry<State>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<State> Serialize for Registry<State>

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<State> StructuralPartialEq for Registry<State>

Auto Trait Implementations§

§

impl<State> Freeze for Registry<State>

§

impl<State> RefUnwindSafe for Registry<State>
where State: RefUnwindSafe,

§

impl<State> Send for Registry<State>
where State: Send,

§

impl<State> Sync for Registry<State>
where State: Sync,

§

impl<State> Unpin for Registry<State>
where State: Unpin,

§

impl<State> UnwindSafe for Registry<State>
where State: 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> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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<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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,