rjango_contrib_postgres/
fields.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct ArrayField {
5 pub base_field: String,
6 pub size: Option<usize>,
7}
8
9impl ArrayField {
10 #[must_use]
11 pub fn new(base_field: impl Into<String>, size: Option<usize>) -> Self {
12 Self {
13 base_field: base_field.into(),
14 size,
15 }
16 }
17}
18
19impl Default for ArrayField {
20 fn default() -> Self {
21 Self::new(String::new(), None)
22 }
23}
24
25#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
26pub struct HStoreField;
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
29pub struct JSONField {
30 pub default: Option<serde_json::Value>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
34pub struct CITextField {
35 pub max_length: Option<usize>,
36}
37
38impl CITextField {
39 #[must_use]
40 pub fn new(max_length: Option<usize>) -> Self {
41 Self { max_length }
42 }
43}
44
45#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
46pub struct IntegerRangeField;
47
48#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
49pub struct BigIntegerRangeField;
50
51#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
52pub struct DecimalRangeField;
53
54#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
55pub struct DateRangeField;
56
57#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
58pub struct DateTimeRangeField;
59
60#[cfg(test)]
61mod tests {
62 use serde_json::json;
63
64 use super::{
65 ArrayField, BigIntegerRangeField, CITextField, DateRangeField, DateTimeRangeField,
66 DecimalRangeField, HStoreField, IntegerRangeField, JSONField,
67 };
68
69 #[test]
70 fn array_field_construction_preserves_configuration() {
71 let field = ArrayField::new("text", Some(4));
72
73 assert_eq!(field.base_field, "text");
74 assert_eq!(field.size, Some(4));
75 }
76
77 #[test]
78 fn array_field_default_is_unbounded_and_empty() {
79 let field = ArrayField::default();
80
81 assert!(field.base_field.is_empty());
82 assert_eq!(field.size, None);
83 }
84
85 #[test]
86 fn hstore_field_default_constructs() {
87 let field = HStoreField;
88 let defaulted = HStoreField;
89
90 assert_eq!(format!("{field:?}"), format!("{defaulted:?}"));
91 }
92
93 #[test]
94 fn json_field_supports_default_values() {
95 let field = JSONField {
96 default: Some(json!({ "enabled": true })),
97 };
98
99 assert_eq!(field.default, Some(json!({ "enabled": true })));
100 }
101
102 #[test]
103 fn json_field_default_is_empty() {
104 let field = JSONField::default();
105
106 assert_eq!(field.default, None);
107 }
108
109 #[test]
110 fn citext_field_construction_preserves_max_length() {
111 let field = CITextField::new(Some(255));
112
113 assert_eq!(field.max_length, Some(255));
114 }
115
116 #[test]
117 fn citext_field_default_has_no_length_limit() {
118 let field = CITextField::default();
119
120 assert_eq!(field.max_length, None);
121 }
122
123 #[test]
124 fn integer_range_field_default_constructs() {
125 let field = IntegerRangeField;
126
127 assert_eq!(format!("{field:?}"), "IntegerRangeField");
128 }
129
130 #[test]
131 fn big_integer_range_field_default_constructs() {
132 let field = BigIntegerRangeField;
133
134 assert_eq!(format!("{field:?}"), "BigIntegerRangeField");
135 }
136
137 #[test]
138 fn decimal_range_field_default_constructs() {
139 let field = DecimalRangeField;
140
141 assert_eq!(format!("{field:?}"), "DecimalRangeField");
142 }
143
144 #[test]
145 fn date_range_field_default_constructs() {
146 let field = DateRangeField;
147
148 assert_eq!(format!("{field:?}"), "DateRangeField");
149 }
150
151 #[test]
152 fn date_time_range_field_default_constructs() {
153 let field = DateTimeRangeField;
154
155 assert_eq!(format!("{field:?}"), "DateTimeRangeField");
156 }
157}