1use crate::Field;
2
3pub trait Reflected: Send + Default + 'static {
4 fn type_name() -> &'static str;
5
6 fn fields() -> &'static [Field<Self>];
7
8 fn get_value(&self, field: Field<Self>) -> String;
9 fn set_value(&mut self, field: Field<Self>, value: Option<&str>);
10
11 #[cfg(feature = "sqlx_bind")]
12 fn bind_to_sqlx_query<'q, O>(
13 self,
14 query: sqlx::query::QueryAs<'q, sqlx::Postgres, O, <sqlx::Postgres as sqlx::Database>::Arguments<'q>>,
15 ) -> sqlx::query::QueryAs<'q, sqlx::Postgres, O, <sqlx::Postgres as sqlx::Database>::Arguments<'q>>;
16
17 fn field_by_name(name: &str) -> Field<Self> {
18 *Self::fields().iter().find(|a| a.name == name).unwrap_or_else(|| {
19 panic!(
20 "Failed to get field_by_name of {}. Field name: {name}",
21 Self::type_name(),
22 )
23 })
24 }
25
26 fn value_by_name(&self, name: &str) -> String {
27 self.get_value(Self::field_by_name(name))
28 }
29}