avina_wire/budgeting/
budget_over_tree.rs

1use std::collections::HashMap;
2
3use chrono::{DateTime, FixedOffset};
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
8pub struct BudgetOverTreeParams {
9    pub all: Option<bool>,
10    pub project: Option<u32>,
11    pub user: Option<u32>,
12    pub end: Option<DateTime<FixedOffset>>,
13}
14
15#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
16pub struct BudgetOverTreeServer {
17    pub total: f64,
18    pub flavors: HashMap<String, f64>,
19}
20
21#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
22pub struct BudgetOverTreeUser {
23    pub cost: f64,
24    pub budget_id: Option<u32>,
25    pub budget: Option<u64>,
26    pub over: bool,
27    pub servers: HashMap<Uuid, BudgetOverTreeServer>,
28    pub flavors: HashMap<String, f64>,
29}
30
31#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
32pub struct BudgetOverTreeProject {
33    pub cost: f64,
34    pub budget_id: Option<u32>,
35    pub budget: Option<u64>,
36    pub over: bool,
37    pub users: HashMap<String, BudgetOverTreeUser>,
38    // TODO: why is this an option?
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub flavors: Option<HashMap<String, f64>>,
41}
42
43#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
44pub struct BudgetOverTree {
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub cost: Option<f64>,
47    pub projects: HashMap<String, BudgetOverTreeProject>,
48    // TODO: why is this an option?
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub flavors: Option<HashMap<String, f64>>,
51}