fastly 0.12.0

Fastly Compute API
Documentation
//! Config Store for Compute.

pub(crate) mod handle;

use handle::ConfigStoreHandle;
pub use handle::{LookupError, OpenError};

/// This constant is used as the default initial buffer size for config store values
/// when using the high-level config store API. This value was chosen with the expectation
/// that config store values are typically small.
const INITIAL_BUF_LEN: usize = 256;

/// A Compute Config Store.
pub struct ConfigStore {
    handle: ConfigStoreHandle,
}

impl ConfigStore {
    /// Open a config store, given its name.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// # use fastly::ConfigStore;
    /// let merriam = ConfigStore::open("merriam webster");
    /// let oed = ConfigStore::open("oxford english config store");
    /// ```
    pub fn open(name: &str) -> Self {
        let handle = match ConfigStoreHandle::open(name) {
            Ok(h) if h.is_valid() => h,
            Ok(_) => panic!("could not open config store `{name}`"),
            Err(e) => panic!("could not open config store `{name}`: {e}"),
        };

        Self { handle }
    }

    /// Try to open a config store, given its name.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// # use fastly::config_store::*;
    /// # fn f() -> Result<(), OpenError> {
    /// let merriam = ConfigStore::try_open("merriam webster")?;
    /// # Ok(()) }
    /// ```
    pub fn try_open(name: &str) -> Result<Self, OpenError> {
        ConfigStoreHandle::open(name).map(|handle| Self { handle })
    }

    /// Lookup a value in this config store.
    ///
    /// If successful, this function returns `Some(_)` if an entry was found, or `None` if no entry
    /// with the given key was found.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// # use fastly::ConfigStore;
    /// # let config_store = ConfigStore::open("test config store");
    /// #
    /// assert_eq!(
    ///      config_store.get("bread"),
    ///      Some(String::from("a usually baked and leavened food")),
    /// );
    /// assert_eq!(
    ///     config_store.get("freedom"),
    ///     Some(String::from("the absence of necessity, coercion, or constraint")),
    /// );
    ///
    /// // Otherwise, `get` will return nothing.
    /// assert!(config_store.get("zzzzz").is_none());
    /// ```
    ///
    /// # Panics
    ///
    /// This may panic for any of the reasons that [`ConfigStore::try_get`] would return an error.
    pub fn get(&self, key: &str) -> Option<String> {
        self.try_get(key)
            .unwrap_or_else(|e| panic!("lookup for key `{key}` failed: {e}"))
    }

    /// Try to lookup a value in this Config Store.
    ///
    /// If successful, this function returns `Ok(Some(_))` if an entry was found, or `Ok(None)` if
    /// no entry with the given key was found. This function returns `Err(_)` if the lookup failed.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// # use fastly::config_store::*;
    /// # fn f() -> Result<(), LookupError> {
    /// # use fastly::ConfigStore;
    /// # let config_store = ConfigStore::open("test config store");
    /// assert_eq!(
    ///      config_store.try_get("bread")?,
    ///      Some(String::from("a usually baked and leavened food")),
    /// );
    /// assert_eq!(
    ///     config_store.try_get("freedom")?,
    ///     Some(String::from("the absence of necessity, coercion, or constraint")),
    /// );
    ///
    /// // Otherwise, `try_get` will return nothing.
    /// assert!(config_store.try_get("zzzzz")?.is_none());
    /// # Ok(()) }
    /// ```
    pub fn try_get(&self, key: &str) -> Result<Option<String>, LookupError> {
        self.handle.get(key, INITIAL_BUF_LEN)
    }

    /// Return true if the config_store contains an entry with the given key.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// # use fastly::ConfigStore;
    /// # let config_store = ConfigStore::open("test config_store");
    /// #
    /// assert!(config_store.contains("key"));
    /// ```
    ///
    /// # Panics
    ///
    /// This may panic for any of the reasons that [`ConfigStore::try_get`] would return an error.
    pub fn contains(&self, key: &str) -> bool {
        self.handle
            .contains(key)
            .unwrap_or_else(|e| panic!("lookup for key `{key}` failed: {e}"))
    }
}