use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use crate::{Extensions, ListOrMap, MapKey, Resource, StringOrNumber};
impl Resource<Volume> {
#[must_use]
pub const fn name(&self) -> Option<&String> {
match self {
Self::External { name } => name.as_ref(),
Self::Compose(volume) => volume.name.as_ref(),
}
}
}
impl From<Volume> for Resource<Volume> {
fn from(value: Volume) -> Self {
Self::Compose(value)
}
}
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
pub struct Volume {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub driver: Option<String>,
#[serde(default, skip_serializing_if = "IndexMap::is_empty")]
pub driver_opts: IndexMap<MapKey, StringOrNumber>,
#[serde(default, skip_serializing_if = "ListOrMap::is_empty")]
pub labels: ListOrMap,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
impl Volume {
#[must_use]
pub fn is_empty(&self) -> bool {
let Self {
driver,
driver_opts,
labels,
name,
extensions,
} = self;
driver.is_none()
&& driver_opts.is_empty()
&& labels.is_empty()
&& name.is_none()
&& extensions.is_empty()
}
}