falco_plugin 0.5.1

High level bindings for the Falco plugin API
Documentation
use crate::plugin::error::last_error::LastError;
use crate::FailureReason;
use anyhow::Context;
use falco_plugin_api::ss_plugin_rc;

pub trait AsResult {
    fn as_result(&self) -> Result<(), FailureReason>;
}

impl AsResult for ss_plugin_rc {
    fn as_result(&self) -> Result<(), FailureReason> {
        use falco_plugin_api as b;
        match *self {
            b::ss_plugin_rc_SS_PLUGIN_SUCCESS => Ok(()),
            b::ss_plugin_rc_SS_PLUGIN_FAILURE => Err(FailureReason::Failure),
            b::ss_plugin_rc_SS_PLUGIN_TIMEOUT => Err(FailureReason::Timeout),
            b::ss_plugin_rc_SS_PLUGIN_EOF => Err(FailureReason::Timeout),
            b::ss_plugin_rc_SS_PLUGIN_NOT_SUPPORTED => Err(FailureReason::NotSupported),
            _ => Err(FailureReason::Failure),
        }
    }
}

pub trait WithLastError {
    type Decorated;

    fn with_last_error(self, last_error: &LastError) -> Self::Decorated;
}

impl<T, E> WithLastError for Result<T, E>
where
    E: Into<anyhow::Error>,
    Self: Context<T, E>,
{
    type Decorated = anyhow::Result<T>;

    fn with_last_error(self, last_error: &LastError) -> Self::Decorated {
        match self {
            Ok(ok) => Ok(ok),
            Err(_) => {
                let Some(msg) = last_error.get() else {
                    return self.map_err(|e| e.into());
                };

                self.context(msg)
            }
        }
    }
}