#![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::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 {
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: Sync + Send + 'static + Sized + for<'de> Deserialize<'de>,
{
bmc.get::<Self>(self.odata_id())
}
}
pub trait Expandable:
EntityTypeRef + Send + Sync + Sized + 'static + for<'a> Deserialize<'a>
{
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 trait Creatable<V: Sync + Send + Serialize, R: Sync + Send + Sized + for<'de> Deserialize<'de>>:
EntityTypeRef + Sized
{
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 + Sized
where
Self: Sync + Send + Sized + 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 + Sized + Sync + Send + 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;
}