Skip to content

Commit 2ff8248

Browse files
feat(sidekick): Generate setter samples for repeated and map fields (#2368)
1 parent c9e1cdc commit 2ff8248

File tree

5 files changed

+355
-10
lines changed

5 files changed

+355
-10
lines changed

internal/sidekick/internal/rust/templates/common/message.mustache

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,8 @@ impl {{Codec.Name}} {
104104
{{/Codec.IsBoxed}}
105105
{{/Optional}}
106106
{{/Singular}}
107-
{{^Singular}}
108-
/// Sets the value of [{{Codec.FieldName}}][{{Codec.FQMessageName}}::{{Codec.SetterName}}].
109-
{{#Deprecated}}
110-
#[deprecated]
111-
{{/Deprecated}}
112-
{{/Singular}}
113107
{{#Repeated}}
108+
{{> /templates/common/setter_preamble/repeated}}
114109
pub fn set_{{Codec.SetterName}}<T, V>(mut self, v: T) -> Self
115110
where
116111
T: std::iter::IntoIterator<Item = V>,
@@ -122,6 +117,7 @@ impl {{Codec.Name}} {
122117
}
123118
{{/Repeated}}
124119
{{#Map}}
120+
{{> /templates/common/setter_preamble/map}}
125121
pub fn set_{{Codec.SetterName}}<T, K, V>(mut self, v: T) -> Self
126122
where
127123
T: std::iter::IntoIterator<Item = (K, V)>,
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
{{!
2+
Copyright 2025 Google LLC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
https://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
}}
16+
/// Sets the value of [{{Codec.FieldName}}][{{Codec.FQMessageName}}::{{Codec.SetterName}}].
17+
{{#ModelCodec.GenerateSetterSamples}}
18+
{{#Codec.KeyField.IsString}}
19+
{{#Codec.ValueField.IsString}}
20+
///
21+
/// # Example
22+
/// ```
23+
/// # use {{Parent.Codec.NameInExamples}};
24+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
25+
/// ("key0", "abc"),
26+
/// ("key1", "xyz"),
27+
/// ]);
28+
/// ```
29+
{{/Codec.ValueField.IsString}}
30+
{{#Codec.ValueField.IsBytes}}
31+
///
32+
/// # Example
33+
/// ```
34+
/// # use {{Parent.Codec.NameInExamples}};
35+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
36+
/// ("key0", bytes::Bytes::from_static(b"abc")),
37+
/// ("key1", bytes::Bytes::from_static(b"xyz")),
38+
/// ]);
39+
/// ```
40+
{{/Codec.ValueField.IsBytes}}
41+
{{#Codec.ValueField.IsBool}}
42+
///
43+
/// # Example
44+
/// ```
45+
/// # use {{Parent.Codec.NameInExamples}};
46+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
47+
/// ("key0", true),
48+
/// ("key1", false),
49+
/// ]);
50+
/// ```
51+
{{/Codec.ValueField.IsBool}}
52+
{{#Codec.ValueField.IsLikeInt}}
53+
///
54+
/// # Example
55+
/// ```
56+
/// # use {{Parent.Codec.NameInExamples}};
57+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
58+
/// ("key0", 123),
59+
/// ("key1", 456),
60+
/// ]);
61+
/// ```
62+
{{/Codec.ValueField.IsLikeInt}}
63+
{{#Codec.ValueField.IsLikeFloat}}
64+
///
65+
/// # Example
66+
/// ```
67+
/// # use {{Parent.Codec.NameInExamples}};
68+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
69+
/// ("key0", 123.5),
70+
/// ("key1", 456.5),
71+
/// ]);
72+
/// ```
73+
{{/Codec.ValueField.IsLikeFloat}}
74+
{{#Codec.ValueField.IsEnum}}
75+
///
76+
/// # Example
77+
/// ```
78+
/// # use {{Parent.Codec.NameInExamples}};
79+
/// use {{Codec.ValueField.EnumType.Codec.NameInExamples}};
80+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
81+
/// ("key0", {{Codec.ValueField.EnumType.Codec.Name}}::default()),
82+
/// ("key1", {{Codec.ValueField.EnumType.Codec.Name}}::default()),
83+
/// ]);
84+
/// ```
85+
{{/Codec.ValueField.IsEnum}}
86+
{{#Codec.ValueField.IsObject}}
87+
///
88+
/// # Example
89+
/// ```
90+
/// # use {{Parent.Codec.NameInExamples}};
91+
/// use {{Codec.ValueField.MessageType.Codec.NameInExamples}};
92+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
93+
/// ("key0", {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use setters */),
94+
/// ("key1", {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use (different) setters */),
95+
/// ]);
96+
/// ```
97+
{{/Codec.ValueField.IsObject}}
98+
{{/Codec.KeyField.IsString}}
99+
{{#Codec.KeyField.IsBool}}
100+
{{#Codec.ValueField.IsString}}
101+
///
102+
/// # Example
103+
/// ```
104+
/// # use {{Parent.Codec.NameInExamples}};
105+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
106+
/// (true, "abc"),
107+
/// (false, "xyz"),
108+
/// ]);
109+
/// ```
110+
{{/Codec.ValueField.IsString}}
111+
{{#Codec.ValueField.IsBytes}}
112+
///
113+
/// # Example
114+
/// ```
115+
/// # use {{Parent.Codec.NameInExamples}};
116+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
117+
/// (true, bytes::Bytes::from_static(b"abc")),
118+
/// (false, bytes::Bytes::from_static(b"xyz")),
119+
/// ]);
120+
/// ```
121+
{{/Codec.ValueField.IsBytes}}
122+
{{#Codec.ValueField.IsBool}}
123+
///
124+
/// # Example
125+
/// ```
126+
/// # use {{Parent.Codec.NameInExamples}};
127+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
128+
/// (true, true),
129+
/// (false, false),
130+
/// ]);
131+
/// ```
132+
{{/Codec.ValueField.IsBool}}
133+
{{#Codec.ValueField.IsLikeInt}}
134+
///
135+
/// # Example
136+
/// ```
137+
/// # use {{Parent.Codec.NameInExamples}};
138+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
139+
/// (true, 123),
140+
/// (false, 456),
141+
/// ]);
142+
/// ```
143+
{{/Codec.ValueField.IsLikeInt}}
144+
{{#Codec.ValueField.IsLikeFloat}}
145+
///
146+
/// # Example
147+
/// ```
148+
/// # use {{Parent.Codec.NameInExamples}};
149+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
150+
/// (true, 123.5),
151+
/// (false, 456.5),
152+
/// ]);
153+
/// ```
154+
{{/Codec.ValueField.IsLikeFloat}}
155+
{{#Codec.ValueField.IsEnum}}
156+
///
157+
/// # Example
158+
/// ```
159+
/// # use {{Parent.Codec.NameInExamples}};
160+
/// use {{Codec.ValueField.EnumType.Codec.NameInExamples}};
161+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
162+
/// (true, {{Codec.ValueField.EnumType.Codec.Name}}::default()),
163+
/// (false, {{Codec.ValueField.EnumType.Codec.Name}}::default()),
164+
/// ]);
165+
/// ```
166+
{{/Codec.ValueField.IsEnum}}
167+
{{#Codec.ValueField.IsObject}}
168+
///
169+
/// # Example
170+
/// ```
171+
/// # use {{Parent.Codec.NameInExamples}};
172+
/// use {{Codec.ValueField.MessageType.Codec.NameInExamples}};
173+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
174+
/// (true, {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use setters */),
175+
/// (false, {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use (different) setters */),
176+
/// ]);
177+
/// ```
178+
{{/Codec.ValueField.IsObject}}
179+
{{/Codec.KeyField.IsBool}}
180+
{{#Codec.KeyField.IsLikeInt}}
181+
{{#Codec.ValueField.IsString}}
182+
///
183+
/// # Example
184+
/// ```
185+
/// # use {{Parent.Codec.NameInExamples}};
186+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
187+
/// (0, "abc"),
188+
/// (1, "xyz"),
189+
/// ]);
190+
/// ```
191+
{{/Codec.ValueField.IsString}}
192+
{{#Codec.ValueField.IsBytes}}
193+
///
194+
/// # Example
195+
/// ```
196+
/// # use {{Parent.Codec.NameInExamples}};
197+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
198+
/// (0, bytes::Bytes::from_static(b"abc")),
199+
/// (1, bytes::Bytes::from_static(b"xyz")),
200+
/// ]);
201+
/// ```
202+
{{/Codec.ValueField.IsBytes}}
203+
{{#Codec.ValueField.IsBool}}
204+
///
205+
/// # Example
206+
/// ```
207+
/// # use {{Parent.Codec.NameInExamples}};
208+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
209+
/// (0, true),
210+
/// (1, false),
211+
/// ]);
212+
/// ```
213+
{{/Codec.ValueField.IsBool}}
214+
{{#Codec.ValueField.IsLikeInt}}
215+
///
216+
/// # Example
217+
/// ```
218+
/// # use {{Parent.Codec.NameInExamples}};
219+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
220+
/// (0, 123),
221+
/// (1, 456),
222+
/// ]);
223+
/// ```
224+
{{/Codec.ValueField.IsLikeInt}}
225+
{{#Codec.ValueField.IsLikeFloat}}
226+
///
227+
/// # Example
228+
/// ```
229+
/// # use {{Parent.Codec.NameInExamples}};
230+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
231+
/// (0, 123.5),
232+
/// (1, 456.5),
233+
/// ]);
234+
/// ```
235+
{{/Codec.ValueField.IsLikeFloat}}
236+
{{#Codec.ValueField.IsEnum}}
237+
///
238+
/// # Example
239+
/// ```
240+
/// # use {{Parent.Codec.NameInExamples}};
241+
/// use {{Codec.ValueField.EnumType.Codec.NameInExamples}};
242+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
243+
/// (0, {{Codec.ValueField.EnumType.Codec.Name}}::default()),
244+
/// (1, {{Codec.ValueField.EnumType.Codec.Name}}::default()),
245+
/// ]);
246+
/// ```
247+
{{/Codec.ValueField.IsEnum}}
248+
{{#Codec.ValueField.IsObject}}
249+
///
250+
/// # Example
251+
/// ```
252+
/// # use {{Parent.Codec.NameInExamples}};
253+
/// use {{Codec.ValueField.MessageType.Codec.NameInExamples}};
254+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([
255+
/// (0, {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use setters */),
256+
/// (1, {{Codec.ValueField.MessageType.Codec.Name}}::default()/* use (different) setters */),
257+
/// ]);
258+
/// ```
259+
{{/Codec.ValueField.IsObject}}
260+
{{/Codec.KeyField.IsLikeInt}}
261+
{{/ModelCodec.GenerateSetterSamples}}
262+
{{#Deprecated}}
263+
#[deprecated]
264+
{{/Deprecated}}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{{!
2+
Copyright 2025 Google LLC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
https://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
}}
16+
/// Sets the value of [{{Codec.FieldName}}][{{Codec.FQMessageName}}::{{Codec.SetterName}}].
17+
{{#ModelCodec.GenerateSetterSamples}}
18+
{{#IsString}}
19+
///
20+
/// # Example
21+
/// ```
22+
/// # use {{Parent.Codec.NameInExamples}};
23+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}(["a", "b", "c"]);
24+
/// ```
25+
{{/IsString}}
26+
{{#IsBytes}}
27+
///
28+
/// # Example
29+
/// ```
30+
/// # use {{Parent.Codec.NameInExamples}};
31+
/// let b1 = bytes::Bytes::from_static(b"abc");
32+
/// let b2 = bytes::Bytes::from_static(b"xyz");
33+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([b1, b2]);
34+
/// ```
35+
{{/IsBytes}}
36+
{{#IsLikeBool}}
37+
///
38+
/// # Example
39+
/// ```
40+
/// # use {{Parent.Codec.NameInExamples}};
41+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([true, false, true]);
42+
/// ```
43+
{{/IsLikeBool}}
44+
{{#IsLikeInt}}
45+
///
46+
/// # Example
47+
/// ```
48+
/// # use {{Parent.Codec.NameInExamples}};
49+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([1, 2, 3]);
50+
/// ```
51+
{{/IsLikeInt}}
52+
{{#IsLikeFloat}}
53+
///
54+
/// # Example
55+
/// ```
56+
/// # use {{Parent.Codec.NameInExamples}};
57+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([1.0, 2.0, 3.0]);
58+
/// ```
59+
{{/IsLikeFloat}}
60+
{{#IsEnum}}
61+
///
62+
/// # Example
63+
/// ```
64+
/// # use {{Parent.Codec.NameInExamples}};
65+
/// use {{EnumType.Codec.NameInExamples}};
66+
/// let x = {{Parent.Codec.Name}}::new().set_{{Codec.SetterName}}([ {{EnumType.Codec.Name}}::default() ]);
67+
/// ```
68+
{{/IsEnum}}
69+
{{#IsObject}}
70+
///
71+
/// # Example
72+
/// ```
73+
/// # use {{Parent.Codec.NameInExamples}};
74+
/// use {{MessageType.Codec.NameInExamples}};
75+
/// let x = {{Parent.Codec.Name}}::new()
76+
/// .set_{{Codec.SetterName}}([
77+
/// {{MessageType.Codec.Name}}::default()/* use setters */,
78+
/// {{MessageType.Codec.Name}}::default()/* use (different) setters */,
79+
/// ]);
80+
/// ```
81+
{{/IsObject}}
82+
{{/ModelCodec.GenerateSetterSamples}}
83+
{{#Deprecated}}
84+
#[deprecated]
85+
{{/Deprecated}}

internal/sidekick/internal/rust/templates/common/setter_preamble/singular_option.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ limitations under the License.
6767
/// # Example
6868
/// ```
6969
/// # use {{Parent.Codec.NameInExamples}};
70-
/// # use {{EnumType.Codec.NameInExamples}};
70+
/// use {{EnumType.Codec.NameInExamples}};
7171
/// let x = {{Parent.Codec.Name}}::new().set_or_clear_{{Codec.SetterName}}({{EnumType.Codec.Name}}::default());
7272
/// let x = {{Parent.Codec.Name}}::new().set_or_clear_{{Codec.SetterName}}(None::<{{EnumType.Codec.Name}}>);
7373
/// ```
@@ -77,7 +77,7 @@ limitations under the License.
7777
/// # Example
7878
/// ```
7979
/// # use {{Parent.Codec.NameInExamples}};
80-
/// # use {{MessageType.Codec.NameInExamples}};
80+
/// use {{MessageType.Codec.NameInExamples}};
8181
/// let x = {{Parent.Codec.Name}}::new().set_or_clear_{{Codec.SetterName}}(Some({{MessageType.Codec.Name}}::default()/* use setters */));
8282
/// let x = {{Parent.Codec.Name}}::new().set_or_clear_{{Codec.SetterName}}(None::<{{MessageType.Codec.Name}}>);
8383
/// ```

0 commit comments

Comments
 (0)