lrzcc_wire/resources/
flavor.rs

1use crate::common::display_option;
2use crate::resources::FlavorGroupMinimal;
3use serde::{Deserialize, Serialize};
4use sqlx::{mysql::MySqlRow, FromRow, Row};
5use std::fmt::Display;
6use tabled::Tabled;
7
8#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
9pub struct Flavor {
10    pub id: u32,
11    pub name: String,
12    pub openstack_id: String, // UUIDv4
13    #[tabled(display_with = "display_option")]
14    pub group: Option<u32>,
15    #[tabled(display_with = "display_option")]
16    pub group_name: Option<String>,
17    pub weight: u32,
18}
19
20impl<'r> FromRow<'r, MySqlRow> for Flavor {
21    fn from_row(row: &'r MySqlRow) -> Result<Self, sqlx::Error> {
22        let id: u32 = row.try_get::<i32, _>("id")?.try_into().unwrap();
23        let name: String = row.try_get("name")?;
24        let openstack_id: String = row.try_get("openstack_id")?;
25        let group: Option<u32> = row
26            .try_get::<Option<i32>, _>("group_id")?
27            .map(|g| g.try_into().unwrap());
28        let group_name: Option<String> = row.try_get("group_name")?;
29        let weight: u32 = row.try_get("weight")?;
30        Ok(Flavor {
31            id,
32            name,
33            openstack_id,
34            group,
35            group_name,
36            weight,
37        })
38    }
39}
40
41impl Display for Flavor {
42    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43        f.write_str(&format!("Flavor(id={}, name={})", self.id, self.name))
44    }
45}
46
47#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq, FromRow)]
48pub struct FlavorMinimal {
49    pub id: u32,
50    pub name: String,
51}
52
53// TODO maybe rethink the Display implementations
54impl Display for FlavorMinimal {
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56        f.write_str(&format!("Flavor(id={}, name={})", self.id, self.name))
57    }
58}
59
60#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
61pub struct FlavorDetailed {
62    pub id: u32,
63    pub name: String,
64    pub openstack_id: String, // UUIDv4
65    #[tabled(display_with = "display_option")]
66    pub group: Option<FlavorGroupMinimal>,
67    #[tabled(display_with = "display_option")]
68    pub group_name: Option<String>,
69    pub weight: u32,
70}
71
72impl Display for FlavorDetailed {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        f.write_str(&format!("Flavor(id={}, name={})", self.id, self.name))
75    }
76}
77
78#[derive(Clone, Debug, Serialize, Deserialize)]
79pub struct FlavorListParams {
80    pub all: Option<bool>,
81    #[serde(rename = "flavorgroup")]
82    pub group: Option<u32>,
83}
84
85#[derive(Clone, Debug, Deserialize, Serialize, Tabled, PartialEq)]
86pub struct FlavorImport {
87    pub new_flavor_count: u32,
88}
89
90#[derive(Clone, Debug, Serialize, Deserialize)]
91pub struct FlavorCreateData {
92    pub name: String,
93    pub openstack_id: String, // UUIDv4
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub group: Option<u32>,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub weight: Option<u32>,
98}
99
100impl FlavorCreateData {
101    pub fn new(name: String, openstack_id: String) -> Self {
102        Self {
103            name,
104            openstack_id,
105            group: None,
106            weight: None,
107        }
108    }
109}
110
111#[derive(Clone, Debug, Serialize, Deserialize)]
112pub struct FlavorModifyData {
113    pub id: u32,
114
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub name: Option<String>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub openstack_id: Option<String>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub group: Option<Option<u32>>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub weight: Option<u32>,
123}
124
125impl FlavorModifyData {
126    pub fn new(id: u32) -> Self {
127        Self {
128            id,
129            name: None,
130            openstack_id: None,
131            group: None,
132            weight: None,
133        }
134    }
135}
136
137#[derive(Clone, Debug, Deserialize, Serialize, Tabled)]
138pub struct FlavorUsage {
139    pub user_id: u32,
140    pub user_name: String,
141    pub flavor_id: u32,
142    pub flavor_name: String,
143    #[tabled(display_with = "display_option")]
144    pub flavorgroup_id: Option<u32>,
145    #[tabled(display_with = "display_option")]
146    pub flavorgroup_name: Option<String>,
147    pub count: u32,
148    pub usage: u32,
149}
150
151#[derive(Clone, Debug, Deserialize, Serialize, Tabled)]
152pub struct FlavorUsageAggregate {
153    pub flavor_id: u32,
154    pub flavor_name: String,
155    #[tabled(display_with = "display_option")]
156    pub flavorgroup_id: Option<u32>,
157    #[tabled(display_with = "display_option")]
158    pub flavorgroup_name: Option<String>,
159    pub count: u32,
160    pub usage: u32,
161}