1use crate::api::{entry, filter, member, criteria, Endpoint, ObjectInfo, YesNo};
2use bon::Builder;
3use serde::{Deserialize, Serialize};
4use std::fmt::Display;
5
6#[derive(Debug, Deserialize, Serialize)]
7#[serde(rename_all = "lowercase")]
8pub enum DisableOverride {
9 Yes,
10 No,
11}
12
13#[derive(Debug, Deserialize, Serialize)]
14#[serde(rename_all = "kebab-case")]
15pub enum Identifier {
16 IpNetmask(String),
17 IpRange(String),
18 IpWildcard(String),
19 #[serde(rename = "fqdn")]
20 FQDN(String),
21}
22
23impl Display for Identifier {
24 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25 match self {
26 Self::IpNetmask(netmask) => write!(f, "{netmask}"),
27 Self::IpRange(range) => write!(f, "{range}"),
28 Self::IpWildcard(wildcard) => write!(f, "{wildcard}"),
29 Self::FQDN(fqdn) => write!(f, "{fqdn}"),
30 }
31 }
32}
33
34#[derive(Debug, Deserialize, Serialize)]
35#[serde(rename_all = "kebab-case")]
36pub enum Default {
37 #[serde(with = "member")]
38 Port(Vec<String>),
39 IdentByIpProtocol(String),
40 IdentByIcmpType(IcmpType),
41 IdentByIcmp6Type(IcmpType),
42}
43
44#[derive(Debug, Deserialize, Serialize)]
45#[serde(rename_all = "kebab-case")]
46pub enum Scope {
47 ProtocolDataUnit,
48 Session,
49}
50
51#[derive(Clone, Debug, Deserialize, Serialize)]
52#[serde(rename_all = "kebab-case")]
53pub enum Operator {
54 PatternMatch {
55 context: String,
56 pattern: String,
57 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
58 qualifier: Option<Vec<Qualifier>>,
59 },
60 GreaterThan {
61 context: String,
62 value: u32,
63 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
64 qualifier: Option<Vec<Qualifier>>,
65 },
66 LessThan {
67 context: String,
68 value: u32,
69 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
70 qualifier: Option<Vec<Qualifier>>,
71 },
72 EqualTo {
73 context: String,
74 position: Option<String>,
75 mask: Option<String>,
76 value: String,
77 },
78}
79
80#[derive(Debug, Deserialize, Serialize)]
81#[serde(rename_all = "kebab-case")]
82pub enum Tagging {
83 NoTag(YesNo),
84 Tag(Vec<String>),
85}
86
87#[derive(Debug, Deserialize, Serialize)]
88#[serde(rename_all = "lowercase")]
89pub enum Override {
90 #[serde(rename_all = "kebab-case")]
91 Yes {
92 timeout: Option<u32>,
93 halfclose_timeout: Option<u32>,
94 timewait_timeout: Option<u16>,
95 },
96 No,
97}
98
99#[derive(Debug, Deserialize, Serialize)]
100#[serde(rename_all = "lowercase")]
101pub enum Protocol {
102 Tcp(ProtocolInfo),
103 Udp(ProtocolInfo)
104}
105
106#[derive(Debug, Deserialize, Serialize)]
107#[serde(rename_all = "lowercase")]
108pub enum Color {
109 Color1,
110 Color2,
111 Color3,
112 Color4,
113 Color5,
114 Color6,
115 Color7,
116 Color8,
117 Color9,
118 Color10,
119 Color11,
120 Color12,
121 Color13,
122 Color14,
123 Color15,
124 Color16,
125 Color17,
126 Color19,
127 Color20,
128 Color21,
129 Color22,
130 Color23,
131 Color24,
132 Color25,
133 Color26,
134 Color27,
135 Color28,
136 Color29,
137 Color30,
138 Color31,
139 Color32,
140 Color33,
141 Color34,
142 Color35,
143 Color36,
144 Color37,
145 Color38,
146 Color39,
147 Color40,
148 Color41,
149 Color42,
150}
151
152#[derive(Clone, Debug, Deserialize, Serialize)]
153#[serde(rename_all = "kebab-case")]
154pub enum Criteria {
155 Contains(String),
156 Is(String),
157 IsNot(String)
158}
159
160#[derive(Clone, Debug, Deserialize, Serialize)]
161#[serde(rename_all = "lowercase")]
162pub enum OS {
163 Microsoft(String),
164 Apple(String),
165 Google(String),
166 Linux(String),
167 Other(String)
168}
169
170#[derive(Clone, Debug, Deserialize, Serialize)]
171#[serde(rename_all = "lowercase")]
172pub enum Network {
173 WiFi { ssid: String },
174 Mobile { carrier: String },
175 Ethernet,
176 Unknown
177}
178
179#[derive(Clone, Debug, Deserialize, Serialize)]
180#[serde(rename_all = "kebab-case")]
181pub enum NetworkWrapper {
182 Is(Network),
183 IsNot(Network)
184}
185
186#[derive(Clone, Debug, Deserialize, Serialize)]
187#[serde(rename_all = "kebab-case")]
188pub enum IsEnabled {
189 Yes,
190 No,
191 NotAvailable
192}
193
194#[derive(Clone, Debug, Deserialize, Serialize)]
195#[serde(rename_all = "kebab-case")]
196pub enum HIPObjectCriteria {
197 IsInstalled(YesNo),
198 IsEnabled(IsEnabled),
199 MissingPatches(MissingPatches)
200}
201
202#[derive(Clone, Debug, Deserialize, Serialize)]
203#[serde(rename_all = "kebab-case")]
204pub enum Severity {
205 GreaterEqual(u32),
206 GreaterThan(u32),
207 Is(u32),
208 IsNot(u32),
209 LessEqual(u32),
210 LessThan(u32)
211}
212
213#[derive(Clone, Debug, Deserialize, Serialize)]
214#[serde(rename_all = "kebab-case")]
215pub enum Check {
216 HasAny,
217 HasNone,
218 HasAll
219}
220
221#[derive(Clone, Debug, Deserialize, Serialize)]
222#[serde(rename_all = "kebab-case")]
223pub enum TimeRange {
224 Within { days: u16 },
225 NotWithin { days: u16 }
226}
227
228#[derive(Debug, Deserialize, Serialize)]
229pub enum HasMalware {
230 Yes {
231 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
232 excludes: Option<Vec<MobileDeviceApplication>>
233 },
234 No
235}
236
237#[derive(Builder, Debug, Deserialize, Serialize)]
238pub struct ProtocolInfo {
239 port: String,
240 #[serde(rename = "source-port")]
241 source_port: Option<String>,
242 overrides: Option<Override>
243}
244
245#[derive(Builder, Debug, Deserialize, Serialize)]
246pub struct Static {
247 #[serde(flatten)]
248 info: ObjectInfo,
249 #[serde(rename = "static", with = "member")]
250 statics: Vec<String>,
251 #[serde(default, with = "filter::opt", skip_serializing_if = "Option::is_none")]
252 dynamic: Option<String>
253}
254
255#[derive(Builder, Debug, Deserialize, Serialize)]
256pub struct Dynamic {
257 #[serde(flatten)]
258 info: ObjectInfo,
259 #[serde(with = "filter")]
260 dynamic: String
261}
262
263#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
264pub struct Attribute {
265 #[serde(rename = "@name")]
266 pub name: String,
267 #[serde(skip_serializing_if = "Option::is_none")]
268 pub value: Option<String>
269}
270
271#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
272#[serde(rename_all = "kebab-case")]
273pub struct Certificate {
274 #[serde(skip_serializing_if = "Option::is_none")]
275 pub certificate_profile: Option<String>,
276 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
277 pub certificate_attributes: Option<Vec<Attribute>>
278}
279
280#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
281pub struct MobileDeviceApplication {
282 #[serde(rename = "@name")]
283 pub name: String,
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub package: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
287 pub hash: Option<String>
288}
289
290#[derive(Builder, Debug, Deserialize, Serialize)]
291#[serde(rename_all = "kebab-case")]
292pub struct MobileDeviceApplicationWrapper {
293 #[serde(skip_serializing_if = "Option::is_none")]
294 pub has_malware: Option<HasMalware>,
295 #[serde(skip_serializing_if = "Option::is_none")]
296 pub has_unmanaged_app: Option<YesNo>,
297 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
298 pub includes: Option<Vec<MobileDeviceApplication>>
299}
300
301#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
302#[serde(rename_all = "kebab-case")]
303pub struct MobileDevice {
304 #[serde(skip_serializing_if = "Option::is_none")]
305 pub jailbroken: Option<YesNo>,
306 #[serde(skip_serializing_if = "Option::is_none")]
307 pub disk_encrypted: Option<YesNo>,
308 #[serde(skip_serializing_if = "Option::is_none")]
309 pub passcode_set: Option<YesNo>,
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub last_checkin_time: Option<TimeRange>,
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub imei: Option<HIPObjectMatch>,
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub model: Option<HIPObjectMatch>,
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub phone_number: Option<HIPObjectMatch>,
318 #[serde(skip_serializing_if = "Option::is_none")]
319 pub tag: Option<HIPObjectMatch>,
320 #[serde(skip_serializing_if = "Option::is_none")]
321 pub applications: Option<MobileDeviceApplication>
322}
323
324#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
325pub struct PreferenceKey {
326 #[serde(rename = "@name")]
327 pub name: String,
328 #[serde(skip_serializing_if = "Option::is_none")]
329 pub value: Option<String>,
330 #[serde(skip_serializing_if = "Option::is_none")]
331 pub negate: Option<YesNo>
332}
333
334#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
335pub struct Preference {
336 #[serde(rename = "@name")]
337 pub name: String,
338 #[serde(skip_serializing_if = "Option::is_none")]
339 pub negate: Option<YesNo>,
340 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
341 pub key: Option<Vec<PreferenceKey>>
342}
343
344#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
345pub struct RegistryValue {
346 #[serde(rename = "@name")]
347 pub name: String,
348 #[serde(rename = "value-data", skip_serializing_if = "Option::is_none")]
349 pub value_data: Option<String>,
350 #[serde(skip_serializing_if = "Option::is_none")]
351 pub negate: Option<YesNo>
352}
353
354#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
355#[serde(rename_all = "kebab-case")]
356pub struct RegistryKey {
357 #[serde(rename = "@name")]
358 pub name: String,
359 #[serde(skip_serializing_if = "Option::is_none")]
360 pub default_value_data: Option<String>,
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub negate: Option<YesNo>,
363 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
364 pub registry_value: Option<Vec<RegistryValue>>
365}
366
367#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
368pub struct Process {
369 #[serde(rename = "@name")]
370 pub name: String,
371 #[serde(skip_serializing_if = "Option::is_none")]
372 pub running: Option<YesNo>
373}
374
375#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
376#[serde(rename_all = "kebab-case")]
377pub struct CustomCheck {
378 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
379 pub process_list: Option<Vec<Process>>,
380 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
381 pub registry_key: Option<Vec<RegistryKey>>,
382 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
383 pub plist: Option<Vec<Preference>>
384}
385
386#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
387pub struct Vendor {
388 #[serde(rename = "@name")]
389 pub name: String,
390 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
391 pub product: Option<Vec<String>>
392}
393
394#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
395pub struct MissingPatches {
396 #[serde(skip_serializing_if = "Option::is_none")]
397 pub severity: Option<Severity>,
398 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
399 pub patches: Option<Vec<String>>,
400 pub check: Check
401}
402
403#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
404#[serde(rename_all = "kebab-case")]
405pub struct HIPObjectMatch {
406 #[serde(skip_serializing_if = "Option::is_none")]
407 pub criteria: Option<HIPObjectCriteria>,
408 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
409 pub vendor: Option<Vec<Vendor>>,
410 #[serde(skip_serializing_if = "Option::is_none")]
411 pub exclude_vendor: Option<YesNo>
412}
413
414#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
415#[serde(rename_all = "lowercase")]
416pub struct NetworkInfo {
417 pub network: NetworkWrapper
418}
419
420#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
421#[serde(rename_all = "kebab-case")]
422pub struct HostInfo {
423 #[serde(skip_serializing_if = "Option::is_none")]
424 pub domain: Option<Criteria>,
425 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
426 pub os: Option<OS>,
427 #[serde(skip_serializing_if = "Option::is_none")]
428 pub client_version: Option<Criteria>,
429 #[serde(skip_serializing_if = "Option::is_none")]
430 pub host_name: Option<Criteria>,
431 #[serde(skip_serializing_if = "Option::is_none")]
432 pub host_id: Option<Criteria>,
433 #[serde(skip_serializing_if = "Option::is_none")]
434 pub managed: Option<YesNo>,
435 #[serde(skip_serializing_if = "Option::is_none")]
436 pub serial_number: Option<Criteria>,
437}
438
439#[derive(Builder, Debug, Deserialize, Serialize)]
440pub struct IcmpType {
441 pub kind: String,
442 pub code: String,
443}
444
445#[derive(Builder, Debug, Deserialize, Serialize)]
446pub struct GeoLocation {
447 pub latitude: f32,
448 pub longitude: f32,
449}
450
451#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
452pub struct Qualifier {
453 #[serde(rename = "@name")]
454 pub name: String,
455 pub value: String,
456}
457
458#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
459pub struct OrCondition {
460 #[serde(rename = "@name")]
461 pub name: String,
462 pub operator: Operator,
463}
464
465#[derive(Builder, Clone, Debug, Deserialize, Serialize)]
466pub struct AndCondition {
467 #[serde(rename = "@name")]
468 pub name: String,
469 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
470 pub or_condition: Option<Vec<OrCondition>>,
471}
472
473#[derive(Builder, Debug, Deserialize, Serialize)]
474#[serde(rename_all = "kebab-case")]
475pub struct Signature {
476 #[serde(rename = "@name")]
477 pub name: String,
478 #[serde(skip_serializing_if = "Option::is_none")]
479 pub comment: Option<String>,
480 #[serde(skip_serializing_if = "Option::is_none")]
481 pub scope: Option<Scope>,
482 #[serde(skip_serializing_if = "Option::is_none")]
483 pub order_free: Option<YesNo>,
484 #[serde(default, with = "entry::opt", skip_serializing_if = "Option::is_none")]
485 pub and_condition: Option<Vec<AndCondition>>,
486}
487
488#[derive(Builder, Debug, Deserialize, Serialize)]
489pub struct Address {
490 #[serde(flatten)]
491 pub info: ObjectInfo,
492 #[serde(flatten)]
493 pub identifier: Identifier,
494}
495
496impl Endpoint for Address {
498 fn get_uri() -> String {
499 String::from("Objects/Addresses")
500 }
501}
502
503#[derive(Debug, Deserialize, Serialize)]
504pub enum AddressGroup {
505 Static(Static),
506 Dynamic(Dynamic)
507}
508
509impl Endpoint for AddressGroup {
511 fn get_uri() -> String {
512 String::from("Objects/AddressGroups")
513 }
514}
515
516#[derive(Builder, Debug, Deserialize, Serialize)]
517#[serde(rename_all = "kebab-case")]
518pub struct Region {
519 #[serde(flatten)]
520 pub info: ObjectInfo,
521 pub geo_location: GeoLocation,
522 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
523 pub address: Option<Vec<String>>,
524}
525
526impl Endpoint for Region {
528 fn get_uri() -> String {
529 String::from("Objects/Regions")
530 }
531}
532
533#[derive(Builder, Debug, Deserialize, Serialize)]
534pub struct DynamicUserGroup {
535 #[serde(flatten)]
536 pub info: ObjectInfo,
537 pub filter: String,
538}
539
540impl Endpoint for DynamicUserGroup {
542 fn get_uri() -> String {
543 String::from("Objects/DynamicUserGroups")
544 }
545}
546
547#[derive(Builder, Debug, Deserialize, Serialize)]
548#[serde(rename_all = "kebab-case")]
549pub struct Application {
550 #[serde(flatten)]
551 pub info: ObjectInfo,
552 #[serde(skip_serializing_if = "Option::is_none")]
553 pub default: Option<Default>,
554 pub category: String,
555 pub subcategory: String,
556 pub technology: String,
557 #[serde(skip_serializing_if = "Option::is_none")]
558 pub timeout: Option<u32>,
559 #[serde(skip_serializing_if = "Option::is_none")]
560 pub tcp_timeout: Option<u32>,
561 #[serde(skip_serializing_if = "Option::is_none")]
562 pub udp_timeout: Option<u32>,
563 #[serde(skip_serializing_if = "Option::is_none")]
564 pub tcp_half_closed_timeout: Option<u32>,
565 #[serde(skip_serializing_if = "Option::is_none")]
566 pub tcp_time_wait_timeout: Option<u16>,
567 pub risk: u8,
568 #[serde(skip_serializing_if = "Option::is_none")]
569 pub evasive_behavior: Option<YesNo>,
570 #[serde(skip_serializing_if = "Option::is_none")]
571 pub consume_big_bandwidth: Option<YesNo>,
572 #[serde(skip_serializing_if = "Option::is_none")]
573 pub used_by_malware: Option<YesNo>,
574 #[serde(skip_serializing_if = "Option::is_none")]
575 pub able_to_transfer_file: Option<YesNo>,
576 #[serde(skip_serializing_if = "Option::is_none")]
577 pub has_known_vulnerability: Option<YesNo>,
578 #[serde(skip_serializing_if = "Option::is_none")]
579 pub tunnel_other_application: Option<YesNo>,
580 #[serde(skip_serializing_if = "Option::is_none")]
581 pub tunnel_applications: Option<YesNo>,
582 #[serde(skip_serializing_if = "Option::is_none")]
583 pub prone_to_misuse: Option<YesNo>,
584 #[serde(skip_serializing_if = "Option::is_none")]
585 pub pervasive_use: Option<YesNo>,
586 #[serde(skip_serializing_if = "Option::is_none")]
587 pub file_type_ident: Option<YesNo>,
588 #[serde(skip_serializing_if = "Option::is_none")]
589 pub virus_ident: Option<YesNo>,
590 #[serde(skip_serializing_if = "Option::is_none")]
591 pub data_ident: Option<YesNo>,
592 #[serde(skip_serializing_if = "Option::is_none")]
593 pub no_appid_caching: Option<YesNo>,
594 #[serde(skip_serializing_if = "Option::is_none")]
595 pub alg_disable_capability: Option<String>,
596 #[serde(skip_serializing_if = "Option::is_none")]
597 pub parent_app: Option<String>,
598}
599
600impl Endpoint for Application {
602 fn get_uri() -> String {
603 String::from("Objects/Applications")
604 }
605}
606
607#[derive(Builder, Debug, Deserialize, Serialize)]
608pub struct ApplicationGroup {
609 #[serde(flatten)]
610 pub info: ObjectInfo,
611 #[serde(with = "member")]
612 pub members: Vec<String>,
613}
614
615impl Endpoint for ApplicationGroup {
617 fn get_uri() -> String {
618 String::from("Objects/ApplicationGroups")
619 }
620}
621
622#[derive(Builder, Debug, Deserialize, Serialize)]
623pub struct ApplicationFilter {
624 #[serde(flatten)]
625 pub info: ObjectInfo,
626 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
627 pub category: Option<Vec<String>>,
628 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
629 pub subcategory: Option<Vec<String>>,
630 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
631 pub technology: Option<Vec<String>>,
632 #[serde(skip_serializing_if = "Option::is_none")]
633 pub evasive: Option<YesNo>,
634 #[serde(skip_serializing_if = "Option::is_none")]
635 pub excessive_bandwidth_use: Option<YesNo>,
636 #[serde(skip_serializing_if = "Option::is_none")]
637 pub used_by_malware: Option<YesNo>,
638 #[serde(skip_serializing_if = "Option::is_none")]
639 pub transfers_files: Option<YesNo>,
640 #[serde(skip_serializing_if = "Option::is_none")]
641 pub has_known_vulnerabilities: Option<YesNo>,
642 #[serde(skip_serializing_if = "Option::is_none")]
643 pub tunnels_other_apps: Option<YesNo>,
644 #[serde(skip_serializing_if = "Option::is_none")]
645 pub prone_to_misuse: Option<YesNo>,
646 #[serde(skip_serializing_if = "Option::is_none")]
647 pub pervasive: Option<YesNo>,
648 #[serde(skip_serializing_if = "Option::is_none")]
649 pub is_saas: Option<YesNo>,
650 #[serde(skip_serializing_if = "Option::is_none")]
651 pub new_appid: Option<YesNo>,
652 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
653 pub risk: Option<Vec<u32>>,
654 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
655 pub saas_certifications: Option<Vec<String>>,
656 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
657 pub saas_risk: Option<Vec<String>>,
658 #[serde(skip_serializing_if = "Option::is_none")]
659 pub tagging: Option<Tagging>,
660 #[serde(default, with = "member::opt", skip_serializing_if = "Option::is_none")]
661 pub exclude: Option<Vec<String>>,
662}
663
664impl Endpoint for ApplicationFilter {
666 fn get_uri() -> String {
667 String::from("Objects/ApplicationFilters")
668 }
669}
670
671#[derive(Builder, Debug, Deserialize, Serialize)]
672pub struct Service {
673 #[serde(flatten)]
674 pub info: ObjectInfo,
675 pub protocol: String,
676}
677
678impl Endpoint for Service {
680 fn get_uri() -> String {
681 String::from("Objects/Services")
682 }
683}
684
685#[derive(Builder, Debug, Deserialize, Serialize)]
686pub struct ServiceGroup {
687 #[serde(flatten)]
688 pub info: ObjectInfo,
689 #[serde(with = "member")]
690 pub members: Vec<String>,
691}
692
693impl Endpoint for ServiceGroup {
695 fn get_uri() -> String {
696 String::from("Objects/ServiceGroups")
697 }
698}
699
700#[derive(Builder, Debug, Deserialize, Serialize)]
701pub struct Tag {
702 #[serde(flatten)]
703 pub info: ObjectInfo,
704 #[serde(skip_serializing_if = "Option::is_none")]
705 pub color: Option<Color>,
706 #[serde(skip_serializing_if = "Option::is_none")]
707 pub comments: Option<String>,
708}
709
710impl Endpoint for Tag {
712 fn get_uri() -> String {
713 String::from("Objects/Tags")
714 }
715}
716
717
718#[derive(Builder, Debug, Deserialize, Serialize)]
719#[serde(rename_all = "kebab-case")]
720pub struct GlobalProtectHIPObject {
721 #[serde(flatten)]
722 pub info: ObjectInfo,
723 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
724 pub host_info: Option<HostInfo>,
725 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
726 pub network_info: Option<NetworkInfo>,
727 #[serde(skip_serializing_if = "Option::is_none")]
728 pub patch_management: Option<HIPObjectMatch>,
729 #[serde(skip_serializing_if = "Option::is_none")]
730 pub data_loss_prevention: Option<HIPObjectMatch>,
731 #[serde(skip_serializing_if = "Option::is_none")]
732 pub firewall: Option<HIPObjectMatch>,
733 #[serde(skip_serializing_if = "Option::is_none")]
734 pub anti_malware: Option<HIPObjectMatch>,
735 #[serde(skip_serializing_if = "Option::is_none")]
736 pub disk_backup: Option<HIPObjectMatch>,
737 #[serde(skip_serializing_if = "Option::is_none")]
738 pub disk_encryption: Option<HIPObjectMatch>,
739 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
740 pub custom_checks: Option<CustomCheck>,
741 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
742 pub mobile_device: Option<MobileDevice>,
743 #[serde(default, with = "criteria::opt", skip_serializing_if = "Option::is_none")]
744 pub certificate: Option<Certificate>
745}
746
747impl Endpoint for GlobalProtectHIPObject {
749 fn get_uri() -> String {
750 String::from("Objects/GlobalProtectHIPObjects")
751 }
752}