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, #[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
53impl 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, #[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, #[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}