pan_os_rs/
objects.rs

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
496// #[typetag::serialize]
497impl 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
509// #[typetag::serialize]
510impl 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
526// #[typetag::serialize]
527impl 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
540// #[typetag::serialize]
541impl 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
600// #[typetag::serialize]
601impl 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
615// #[typetag::serialize]
616impl 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
664// #[typetag::serialize]
665impl 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
678// #[typetag::serialize]
679impl 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
693// #[typetag::serialize]
694impl 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
710// #[typetag::serialize]
711impl 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
747// #[typetag::serialize]
748impl Endpoint for GlobalProtectHIPObject {
749    fn get_uri() -> String {
750        String::from("Objects/GlobalProtectHIPObjects")
751    }
752}