use serde::{Deserialize, Serialize};
use crate::wire::{lossy_f64, lossy_i64};
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct Quota {
#[serde(default, deserialize_with = "lossy_i64")]
pub free: i64,
#[serde(default, deserialize_with = "lossy_i64")]
pub used: i64,
#[serde(default, deserialize_with = "lossy_i64")]
pub total: i64,
#[serde(default, deserialize_with = "lossy_f64")]
pub relative: f64,
}
impl Quota {
pub const fn new(free: i64, used: i64, total: i64, relative: f64) -> Self {
Self {
free,
used,
total,
relative,
}
}
pub const fn free(&self) -> i64 {
self.free
}
pub const fn used(&self) -> i64 {
self.used
}
pub const fn total(&self) -> i64 {
self.total
}
pub const fn relative(&self) -> f64 {
self.relative
}
pub const fn is_unlimited(&self) -> bool {
self.total < 0
}
pub fn free_bytes(&self) -> Option<u64> {
if self.free >= 0 {
Some(self.free as u64)
} else {
None
}
}
pub fn total_bytes(&self) -> Option<u64> {
if self.total >= 0 {
Some(self.total as u64)
} else {
None
}
}
pub fn used_bytes(&self) -> u64 {
self.used.max(0) as u64
}
pub fn relative_percentage(&self) -> f64 {
if self.relative > 0.0 && self.relative <= 1.0 {
self.relative * 100.0
} else {
self.relative
}
}
}