#![deny(
clippy::all,
clippy::pedantic,
clippy::nursery,
clippy::suspicious,
clippy::complexity,
clippy::perf
)]
#![deny(
clippy::absolute_paths,
clippy::todo,
clippy::unimplemented,
clippy::tests_outside_test_module,
clippy::panic,
clippy::unwrap_used,
clippy::unwrap_in_result,
clippy::unused_trait_names,
clippy::print_stdout,
clippy::print_stderr
)]
#![deny(missing_docs)]
pub mod action;
pub mod bmc;
pub mod deserialize;
pub mod dynamic_properties;
pub mod edm_date_time_offset;
pub mod edm_duration;
pub mod edm_primitive_type;
pub mod nav_property;
pub mod odata;
pub mod query;
use crate::query::ExpandQuery;
use futures_core::TryStream;
use serde::{Deserialize, Serialize};
use std::fmt;
use std::pin::Pin;
use std::{future::Future, sync::Arc};
#[doc(inline)]
pub use action::Action;
#[doc(inline)]
pub use action::ActionError;
#[doc(inline)]
pub use bmc::Bmc;
#[doc(inline)]
pub use deserialize::de_optional_nullable;
#[doc(inline)]
pub use deserialize::de_required_nullable;
#[doc(inline)]
pub use dynamic_properties::DynamicProperties;
#[doc(inline)]
pub use edm_date_time_offset::EdmDateTimeOffset;
#[doc(inline)]
pub use edm_duration::EdmDuration;
#[doc(inline)]
pub use edm_primitive_type::EdmPrimitiveType;
#[doc(inline)]
pub use nav_property::NavProperty;
#[doc(inline)]
pub use nav_property::Reference;
#[doc(inline)]
pub use nav_property::ReferenceLeaf;
#[doc(inline)]
pub use odata::ODataETag;
#[doc(inline)]
pub use odata::ODataId;
#[doc(inline)]
pub use query::FilterQuery;
#[doc(inline)]
pub use query::ToFilterLiteral;
#[doc(inline)]
pub use serde_json::Value as AdditionalProperties;
#[doc(inline)]
pub use uuid::Uuid as EdmGuid;
pub trait EntityTypeRef: Send + Sync + Sized {
fn odata_id(&self) -> &ODataId;
fn etag(&self) -> Option<&ODataETag>;
fn refresh<B: Bmc>(&self, bmc: &B) -> impl Future<Output = Result<Arc<Self>, B::Error>> + Send
where
Self: for<'de> Deserialize<'de> + 'static,
{
bmc.get::<Self>(self.odata_id())
}
}
pub trait Expandable: EntityTypeRef + for<'de> Deserialize<'de> + 'static {
fn expand<B: Bmc>(
&self,
bmc: &B,
query: ExpandQuery,
) -> impl Future<Output = Result<Arc<Self>, B::Error>> + Send {
bmc.expand::<Self>(self.odata_id(), query)
}
}
pub type BoxTryStream<T, E> =
Pin<Box<dyn TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send>>;
#[derive(Debug)]
pub struct AsyncTask {
pub id: ODataId,
pub retry_after_secs: Option<u64>,
}
#[derive(Debug)]
pub enum ModificationResponse<T> {
Entity(T),
Task(AsyncTask),
Empty,
}
pub struct SessionCreateResponse<T> {
pub entity: T,
pub auth_token: String,
pub location: ODataId,
}
impl<T: fmt::Debug> fmt::Debug for SessionCreateResponse<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SessionCreateResponse")
.field("entity", &self.entity)
.field("auth_token", &"[REDACTED]")
.field("location", &self.location)
.finish()
}
}
pub trait Creatable<V: Send + Sync + Serialize, R: Send + Sync + for<'de> Deserialize<'de>>:
EntityTypeRef
{
fn create<B: Bmc>(
&self,
bmc: &B,
create: &V,
) -> impl Future<Output = Result<ModificationResponse<R>, B::Error>> + Send {
bmc.create::<V, R>(self.odata_id(), create)
}
}
pub trait Updatable<V: Sync + Send + Serialize>: EntityTypeRef + for<'de> Deserialize<'de> {
fn update<B: Bmc>(
&self,
bmc: &B,
update: &V,
) -> impl Future<Output = Result<ModificationResponse<Self>, B::Error>> + Send {
bmc.update::<V, Self>(self.odata_id(), self.etag(), update)
}
}
pub trait Deletable: EntityTypeRef + for<'de> Deserialize<'de> {
fn delete<B: Bmc>(
&self,
bmc: &B,
) -> impl Future<Output = Result<ModificationResponse<Self>, B::Error>> + Send {
bmc.delete::<Self>(self.odata_id())
}
}
pub trait RedfishSettings<E: EntityTypeRef>: Sized {
fn settings_object(&self) -> Option<NavProperty<E>>;
}
pub trait ToSnakeCase {
fn to_snake_case(&self) -> &'static str;
}
pub trait FilterProperty {
fn property_path(&self) -> &str;
}