gitlab/api/projects/labels/
label.rs1use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct Label<'a> {
16 #[builder(setter(into))]
18 project: NameOrId<'a>,
19 #[builder(setter(into))]
21 label: NameOrId<'a>,
22
23 #[builder(default)]
27 include_ancestor_groups: Option<bool>,
28}
29
30impl<'a> Label<'a> {
31 pub fn builder() -> LabelBuilder<'a> {
33 LabelBuilder::default()
34 }
35}
36
37impl Endpoint for Label<'_> {
38 fn method(&self) -> Method {
39 Method::GET
40 }
41
42 fn endpoint(&self) -> Cow<'static, str> {
43 format!("projects/{}/labels/{}", self.project, self.label).into()
44 }
45
46 fn parameters(&self) -> QueryParams<'_> {
47 let mut params = QueryParams::default();
48
49 params.push_opt("include_ancestor_groups", self.include_ancestor_groups);
50
51 params
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use crate::api::projects::labels::{Label, LabelBuilderError};
58 use crate::api::{self, Query};
59 use crate::test::client::{ExpectedUrl, SingleTestClient};
60
61 #[test]
62 fn project_and_label_are_needed() {
63 let err = Label::builder().build().unwrap_err();
64 crate::test::assert_missing_field!(err, LabelBuilderError, "project");
65 }
66
67 #[test]
68 fn project_is_needed() {
69 let err = Label::builder().label(1).build().unwrap_err();
70 crate::test::assert_missing_field!(err, LabelBuilderError, "project");
71 }
72
73 #[test]
74 fn label_is_needed() {
75 let err = Label::builder().project(1).build().unwrap_err();
76 crate::test::assert_missing_field!(err, LabelBuilderError, "label");
77 }
78
79 #[test]
80 fn project_and_label_are_sufficient() {
81 Label::builder().project(1).label(1).build().unwrap();
82 }
83
84 #[test]
85 fn label_by_id() {
86 Label::builder().project(1).label(1).build().unwrap();
87 }
88
89 #[test]
90 fn label_by_name() {
91 Label::builder()
92 .project(1)
93 .label("label_name")
94 .build()
95 .unwrap();
96 }
97
98 #[test]
99 fn endpoint() {
100 let endpoint = ExpectedUrl::builder()
101 .endpoint("projects/simple%2Fproject/labels/1")
102 .build()
103 .unwrap();
104 let client = SingleTestClient::new_raw(endpoint, "");
105
106 let endpoint = Label::builder()
107 .project("simple/project")
108 .label(1)
109 .build()
110 .unwrap();
111 api::ignore(endpoint).query(&client).unwrap();
112 }
113
114 #[test]
115 fn endpoint_include_ancestor_groups() {
116 let endpoint = ExpectedUrl::builder()
117 .endpoint("projects/simple%2Fproject/labels/1")
118 .add_query_params(&[("include_ancestor_groups", "true")])
119 .build()
120 .unwrap();
121 let client = SingleTestClient::new_raw(endpoint, "");
122
123 let endpoint = Label::builder()
124 .project("simple/project")
125 .label(1)
126 .include_ancestor_groups(true)
127 .build()
128 .unwrap();
129 api::ignore(endpoint).query(&client).unwrap();
130 }
131
132 #[test]
133 fn endpoint_escapes_label_name() {
134 let endpoint = ExpectedUrl::builder()
135 .endpoint("projects/simple%2Fproject/labels/simple%2Flabel")
136 .build()
137 .unwrap();
138 let client = SingleTestClient::new_raw(endpoint, "");
139
140 let endpoint = Label::builder()
141 .project("simple/project")
142 .label("simple/label")
143 .build()
144 .unwrap();
145 api::ignore(endpoint).query(&client).unwrap();
146 }
147}