Skip to main content

gitea_sdk_rs/options/org/
core.rs

1// Copyright 2026 infinitete. All rights reserved.
2// Use of this source code is governed by a MIT-style
3// license that can be found in the LICENSE file.
4
5use crate::pagination::{ListOptions, QueryEncode};
6use crate::types::enums::VisibleType;
7use crate::{Deserialize, Serialize};
8
9use super::percent_encode;
10
11// ── org.go ──────────────────────────────────────────────────────────────
12
13#[derive(Debug, Clone, Default)]
14pub struct ListOrgsOptions {
15    pub list_options: ListOptions,
16}
17
18impl QueryEncode for ListOrgsOptions {
19    fn query_encode(&self) -> String {
20        self.list_options.query_encode()
21    }
22}
23
24#[derive(Debug, Clone, Default, Serialize, Deserialize)]
25pub struct CreateOrgOption {
26    #[serde(rename = "username")]
27    pub name: String,
28    #[serde(rename = "full_name", skip_serializing_if = "Option::is_none")]
29    pub full_name: Option<String>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub email: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub description: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub website: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub location: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub visibility: Option<VisibleType>,
40    #[serde(
41        rename = "repo_admin_change_team_access",
42        skip_serializing_if = "Option::is_none"
43    )]
44    pub repo_admin_change_team_access: Option<bool>,
45}
46
47impl CreateOrgOption {
48    pub fn validate(&self) -> crate::Result<()> {
49        if self.name.is_empty() {
50            return Err(crate::Error::Validation("org name is required".to_string()));
51        }
52        if let Some(vis) = &self.visibility
53            && !matches!(
54                vis,
55                VisibleType::Public | VisibleType::Limited | VisibleType::Private
56            )
57        {
58            return Err(crate::Error::Validation(
59                "invalid visibility option".to_string(),
60            ));
61        }
62        Ok(())
63    }
64}
65
66#[derive(Debug, Clone, Default, Serialize, Deserialize)]
67pub struct EditOrgOption {
68    #[serde(rename = "full_name", skip_serializing_if = "Option::is_none")]
69    pub full_name: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub email: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub description: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub website: Option<String>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub location: Option<String>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub visibility: Option<VisibleType>,
80    #[serde(
81        rename = "repo_admin_change_team_access",
82        skip_serializing_if = "Option::is_none"
83    )]
84    pub repo_admin_change_team_access: Option<bool>,
85}
86
87impl EditOrgOption {
88    pub fn validate(&self) -> crate::Result<()> {
89        if let Some(vis) = &self.visibility
90            && !matches!(
91                vis,
92                VisibleType::Public | VisibleType::Limited | VisibleType::Private
93            )
94        {
95            return Err(crate::Error::Validation(
96                "invalid visibility option".to_string(),
97            ));
98        }
99        Ok(())
100    }
101}
102
103// ── org_social.go ───────────────────────────────────────────────────────
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct RenameOrgOption {
107    #[serde(rename = "new_name")]
108    pub new_name: String,
109}
110
111#[derive(Debug, Clone, Default)]
112pub struct ListOrgActivityFeedsOptions {
113    pub list_options: ListOptions,
114    pub date: Option<String>,
115}
116
117impl QueryEncode for ListOrgActivityFeedsOptions {
118    fn query_encode(&self) -> String {
119        let mut out = self.list_options.query_encode();
120        if let Some(date) = &self.date {
121            out.push_str(&format!("&date={}", percent_encode(date)));
122        }
123        out
124    }
125}
126
127#[derive(Debug, Clone, Default)]
128pub struct ListTeamActivityFeedsOptions {
129    pub list_options: ListOptions,
130    pub date: Option<String>,
131}
132
133impl QueryEncode for ListTeamActivityFeedsOptions {
134    fn query_encode(&self) -> String {
135        let mut out = self.list_options.query_encode();
136        if let Some(date) = &self.date {
137            out.push_str(&format!("&date={}", percent_encode(date)));
138        }
139        out
140    }
141}
142
143#[cfg(test)]
144mod tests {
145    use super::*;
146    use crate::types::enums::VisibleType;
147
148    #[test]
149    fn test_create_org_option_validate_success() {
150        let opt = CreateOrgOption {
151            name: "myorg".to_string(),
152            ..Default::default()
153        };
154        assert!(opt.validate().is_ok());
155    }
156
157    #[test]
158    fn test_create_org_option_validate_empty_name() {
159        let opt = CreateOrgOption {
160            name: String::new(),
161            ..Default::default()
162        };
163        assert!(opt.validate().is_err());
164    }
165
166    #[test]
167    fn test_create_org_option_validate_invalid_visibility() {
168        let opt = CreateOrgOption {
169            name: "myorg".to_string(),
170            visibility: Some(VisibleType::Unknown),
171            ..Default::default()
172        };
173        assert!(opt.validate().is_err());
174    }
175
176    #[test]
177    fn test_edit_org_option_validate_success() {
178        let opt = EditOrgOption {
179            visibility: Some(VisibleType::Public),
180            ..Default::default()
181        };
182        assert!(opt.validate().is_ok());
183    }
184
185    #[test]
186    fn test_edit_org_option_validate_invalid_visibility() {
187        let opt = EditOrgOption {
188            visibility: Some(VisibleType::Unknown),
189            ..Default::default()
190        };
191        assert!(opt.validate().is_err());
192    }
193}