gcp_client/google/cloud/websecurityscanner/
v1beta.rs

1/// ! Information about a vulnerability with an HTML.
2#[derive(Clone, PartialEq, ::prost::Message)]
3pub struct Form {
4    /// ! The URI where to send the form when it's submitted.
5    #[prost(string, tag="1")]
6    pub action_uri: std::string::String,
7    /// ! The names of form fields related to the vulnerability.
8    #[prost(string, repeated, tag="2")]
9    pub fields: ::std::vec::Vec<std::string::String>,
10}
11/// Information reported for an outdated library.
12#[derive(Clone, PartialEq, ::prost::Message)]
13pub struct OutdatedLibrary {
14    /// The name of the outdated library.
15    #[prost(string, tag="1")]
16    pub library_name: std::string::String,
17    /// The version number.
18    #[prost(string, tag="2")]
19    pub version: std::string::String,
20    /// URLs to learn more information about the vulnerabilities in the library.
21    #[prost(string, repeated, tag="3")]
22    pub learn_more_urls: ::std::vec::Vec<std::string::String>,
23}
24/// Information regarding any resource causing the vulnerability such
25/// as JavaScript sources, image, audio files, etc.
26#[derive(Clone, PartialEq, ::prost::Message)]
27pub struct ViolatingResource {
28    /// The MIME type of this resource.
29    #[prost(string, tag="1")]
30    pub content_type: std::string::String,
31    /// URL of this violating resource.
32    #[prost(string, tag="2")]
33    pub resource_url: std::string::String,
34}
35/// Information about vulnerable request parameters.
36#[derive(Clone, PartialEq, ::prost::Message)]
37pub struct VulnerableParameters {
38    /// The vulnerable parameter names.
39    #[prost(string, repeated, tag="1")]
40    pub parameter_names: ::std::vec::Vec<std::string::String>,
41}
42/// Information about vulnerable or missing HTTP Headers.
43#[derive(Clone, PartialEq, ::prost::Message)]
44pub struct VulnerableHeaders {
45    /// List of vulnerable headers.
46    #[prost(message, repeated, tag="1")]
47    pub headers: ::std::vec::Vec<vulnerable_headers::Header>,
48    /// List of missing headers.
49    #[prost(message, repeated, tag="2")]
50    pub missing_headers: ::std::vec::Vec<vulnerable_headers::Header>,
51}
52pub mod vulnerable_headers {
53    /// Describes a HTTP Header.
54    #[derive(Clone, PartialEq, ::prost::Message)]
55    pub struct Header {
56        /// Header name.
57        #[prost(string, tag="1")]
58        pub name: std::string::String,
59        /// Header value.
60        #[prost(string, tag="2")]
61        pub value: std::string::String,
62    }
63}
64/// Information reported for an XSS.
65#[derive(Clone, PartialEq, ::prost::Message)]
66pub struct Xss {
67    /// Stack traces leading to the point where the XSS occurred.
68    #[prost(string, repeated, tag="1")]
69    pub stack_traces: ::std::vec::Vec<std::string::String>,
70    /// An error message generated by a javascript breakage.
71    #[prost(string, tag="2")]
72    pub error_message: std::string::String,
73}
74/// A Finding resource represents a vulnerability instance identified during a
75/// ScanRun.
76#[derive(Clone, PartialEq, ::prost::Message)]
77pub struct Finding {
78    /// The resource name of the Finding. The name follows the format of
79    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanruns/{scanRunId}/findings/{findingId}'.
80    /// The finding IDs are generated by the system.
81    #[prost(string, tag="1")]
82    pub name: std::string::String,
83    /// The type of the Finding.
84    /// Detailed and up-to-date information on findings can be found here:
85    /// https://cloud.google.com/security-scanner/docs/scan-result-details
86    #[prost(string, tag="2")]
87    pub finding_type: std::string::String,
88    /// The http method of the request that triggered the vulnerability, in
89    /// uppercase.
90    #[prost(string, tag="3")]
91    pub http_method: std::string::String,
92    /// The URL produced by the server-side fuzzer and used in the request that
93    /// triggered the vulnerability.
94    #[prost(string, tag="4")]
95    pub fuzzed_url: std::string::String,
96    /// The body of the request that triggered the vulnerability.
97    #[prost(string, tag="5")]
98    pub body: std::string::String,
99    /// The description of the vulnerability.
100    #[prost(string, tag="6")]
101    pub description: std::string::String,
102    /// The URL containing human-readable payload that user can leverage to
103    /// reproduce the vulnerability.
104    #[prost(string, tag="7")]
105    pub reproduction_url: std::string::String,
106    /// If the vulnerability was originated from nested IFrame, the immediate
107    /// parent IFrame is reported.
108    #[prost(string, tag="8")]
109    pub frame_url: std::string::String,
110    /// The URL where the browser lands when the vulnerability is detected.
111    #[prost(string, tag="9")]
112    pub final_url: std::string::String,
113    /// The tracking ID uniquely identifies a vulnerability instance across
114    /// multiple ScanRuns.
115    #[prost(string, tag="10")]
116    pub tracking_id: std::string::String,
117    /// An addon containing information reported for a vulnerability with an HTML
118    /// form, if any.
119    #[prost(message, optional, tag="16")]
120    pub form: ::std::option::Option<Form>,
121    /// An addon containing information about outdated libraries.
122    #[prost(message, optional, tag="11")]
123    pub outdated_library: ::std::option::Option<OutdatedLibrary>,
124    /// An addon containing detailed information regarding any resource causing the
125    /// vulnerability such as JavaScript sources, image, audio files, etc.
126    #[prost(message, optional, tag="12")]
127    pub violating_resource: ::std::option::Option<ViolatingResource>,
128    /// An addon containing information about vulnerable or missing HTTP headers.
129    #[prost(message, optional, tag="15")]
130    pub vulnerable_headers: ::std::option::Option<VulnerableHeaders>,
131    /// An addon containing information about request parameters which were found
132    /// to be vulnerable.
133    #[prost(message, optional, tag="13")]
134    pub vulnerable_parameters: ::std::option::Option<VulnerableParameters>,
135    /// An addon containing information reported for an XSS, if any.
136    #[prost(message, optional, tag="14")]
137    pub xss: ::std::option::Option<Xss>,
138}
139/// A FindingTypeStats resource represents stats regarding a specific FindingType
140/// of Findings under a given ScanRun.
141#[derive(Clone, PartialEq, ::prost::Message)]
142pub struct FindingTypeStats {
143    /// The finding type associated with the stats.
144    #[prost(string, tag="1")]
145    pub finding_type: std::string::String,
146    /// The count of findings belonging to this finding type.
147    #[prost(int32, tag="2")]
148    pub finding_count: i32,
149}
150/// Defines a custom error message used by CreateScanConfig and UpdateScanConfig
151/// APIs when scan configuration validation fails. It is also reported as part of
152/// a ScanRunErrorTrace message if scan validation fails due to a scan
153/// configuration error.
154#[derive(Clone, PartialEq, ::prost::Message)]
155pub struct ScanConfigError {
156    /// Indicates the reason code for a configuration failure.
157    #[prost(enumeration="scan_config_error::Code", tag="1")]
158    pub code: i32,
159    /// Indicates the full name of the ScanConfig field that triggers this error,
160    /// for example "scan_config.max_qps". This field is provided for
161    /// troubleshooting purposes only and its actual value can change in the
162    /// future.
163    #[prost(string, tag="2")]
164    pub field_name: std::string::String,
165}
166pub mod scan_config_error {
167    /// Output only.
168    /// Defines an error reason code.
169    /// Next id: 44
170    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
171    #[repr(i32)]
172    pub enum Code {
173        /// There is no error.
174        Unspecified = 0,
175        /// Indicates an internal server error.
176        /// Please DO NOT USE THIS ERROR CODE unless the root cause is truly unknown.
177        InternalError = 1,
178        /// One of the seed URLs is an App Engine URL but we cannot validate the scan
179        /// settings due to an App Engine API backend error.
180        AppengineApiBackendError = 2,
181        /// One of the seed URLs is an App Engine URL but we cannot access the
182        /// App Engine API to validate scan settings.
183        AppengineApiNotAccessible = 3,
184        /// One of the seed URLs is an App Engine URL but the Default Host of the
185        /// App Engine is not set.
186        AppengineDefaultHostMissing = 4,
187        /// Google corporate accounts can not be used for scanning.
188        CannotUseGoogleComAccount = 6,
189        /// The account of the scan creator can not be used for scanning.
190        CannotUseOwnerAccount = 7,
191        /// This scan targets Compute Engine, but we cannot validate scan settings
192        /// due to a Compute Engine API backend error.
193        ComputeApiBackendError = 8,
194        /// This scan targets Compute Engine, but we cannot access the Compute Engine
195        /// API to validate the scan settings.
196        ComputeApiNotAccessible = 9,
197        /// The Custom Login URL does not belong to the current project.
198        CustomLoginUrlDoesNotBelongToCurrentProject = 10,
199        /// The Custom Login URL is malformed (can not be parsed).
200        CustomLoginUrlMalformed = 11,
201        /// The Custom Login URL is mapped to a non-routable IP address in DNS.
202        CustomLoginUrlMappedToNonRoutableAddress = 12,
203        /// The Custom Login URL is mapped to an IP address which is not reserved for
204        /// the current project.
205        CustomLoginUrlMappedToUnreservedAddress = 13,
206        /// The Custom Login URL has a non-routable IP address.
207        CustomLoginUrlHasNonRoutableIpAddress = 14,
208        /// The Custom Login URL has an IP address which is not reserved for the
209        /// current project.
210        CustomLoginUrlHasUnreservedIpAddress = 15,
211        /// Another scan with the same name (case-sensitive) already exists.
212        DuplicateScanName = 16,
213        /// A field is set to an invalid value.
214        InvalidFieldValue = 18,
215        /// There was an error trying to authenticate to the scan target.
216        FailedToAuthenticateToTarget = 19,
217        /// Finding type value is not specified in the list findings request.
218        FindingTypeUnspecified = 20,
219        /// Scan targets Compute Engine, yet current project was not whitelisted for
220        /// Google Compute Engine Scanning Alpha access.
221        ForbiddenToScanCompute = 21,
222        /// User tries to update managed scan
223        ForbiddenUpdateToManagedScan = 43,
224        /// The supplied filter is malformed. For example, it can not be parsed, does
225        /// not have a filter type in expression, or the same filter type appears
226        /// more than once.
227        MalformedFilter = 22,
228        /// The supplied resource name is malformed (can not be parsed).
229        MalformedResourceName = 23,
230        /// The current project is not in an active state.
231        ProjectInactive = 24,
232        /// A required field is not set.
233        RequiredField = 25,
234        /// Project id, scanconfig id, scanrun id, or finding id are not consistent
235        /// with each other in resource name.
236        ResourceNameInconsistent = 26,
237        /// The scan being requested to start is already running.
238        ScanAlreadyRunning = 27,
239        /// The scan that was requested to be stopped is not running.
240        ScanNotRunning = 28,
241        /// One of the seed URLs does not belong to the current project.
242        SeedUrlDoesNotBelongToCurrentProject = 29,
243        /// One of the seed URLs is malformed (can not be parsed).
244        SeedUrlMalformed = 30,
245        /// One of the seed URLs is mapped to a non-routable IP address in DNS.
246        SeedUrlMappedToNonRoutableAddress = 31,
247        /// One of the seed URLs is mapped to an IP address which is not reserved
248        /// for the current project.
249        SeedUrlMappedToUnreservedAddress = 32,
250        /// One of the seed URLs has on-routable IP address.
251        SeedUrlHasNonRoutableIpAddress = 33,
252        /// One of the seed URLs has an IP address that is not reserved
253        /// for the current project.
254        SeedUrlHasUnreservedIpAddress = 35,
255        /// The Cloud Security Scanner service account is not configured under the
256        /// project.
257        ServiceAccountNotConfigured = 36,
258        /// A project has reached the maximum number of scans.
259        TooManyScans = 37,
260        /// Resolving the details of the current project fails.
261        UnableToResolveProjectInfo = 38,
262        /// One or more blacklist patterns were in the wrong format.
263        UnsupportedBlacklistPatternFormat = 39,
264        /// The supplied filter is not supported.
265        UnsupportedFilter = 40,
266        /// The supplied finding type is not supported. For example, we do not
267        /// provide findings of the given finding type.
268        UnsupportedFindingType = 41,
269        /// The URL scheme of one or more of the supplied URLs is not supported.
270        UnsupportedUrlScheme = 42,
271    }
272}
273/// Output only.
274/// Defines an error trace message for a ScanRun.
275#[derive(Clone, PartialEq, ::prost::Message)]
276pub struct ScanRunErrorTrace {
277    /// Indicates the error reason code.
278    #[prost(enumeration="scan_run_error_trace::Code", tag="1")]
279    pub code: i32,
280    /// If the scan encounters SCAN_CONFIG_ISSUE error, this field has the error
281    /// message encountered during scan configuration validation that is performed
282    /// before each scan run.
283    #[prost(message, optional, tag="2")]
284    pub scan_config_error: ::std::option::Option<ScanConfigError>,
285    /// If the scan encounters TOO_MANY_HTTP_ERRORS, this field indicates the most
286    /// common HTTP error code, if such is available. For example, if this code is
287    /// 404, the scan has encountered too many NOT_FOUND responses.
288    #[prost(int32, tag="3")]
289    pub most_common_http_error_code: i32,
290}
291pub mod scan_run_error_trace {
292    /// Output only.
293    /// Defines an error reason code.
294    /// Next id: 7
295    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
296    #[repr(i32)]
297    pub enum Code {
298        /// Default value is never used.
299        Unspecified = 0,
300        /// Indicates that the scan run failed due to an internal server error.
301        InternalError = 1,
302        /// Indicates a scan configuration error, usually due to outdated ScanConfig
303        /// settings, such as starting_urls or the DNS configuration.
304        ScanConfigIssue = 2,
305        /// Indicates an authentication error, usually due to outdated ScanConfig
306        /// authentication settings.
307        AuthenticationConfigIssue = 3,
308        /// Indicates a scan operation timeout, usually caused by a very large site.
309        TimedOutWhileScanning = 4,
310        /// Indicates that a scan encountered excessive redirects, either to
311        /// authentication or some other page outside of the scan scope.
312        TooManyRedirects = 5,
313        /// Indicates that a scan encountered numerous errors from the web site
314        /// pages. When available, most_common_http_error_code field indicates the
315        /// most common HTTP error code encountered during the scan.
316        TooManyHttpErrors = 6,
317    }
318}
319/// Output only.
320/// Defines a warning trace message for ScanRun. Warning traces provide customers
321/// with useful information that helps make the scanning process more effective.
322#[derive(Clone, PartialEq, ::prost::Message)]
323pub struct ScanRunWarningTrace {
324    /// Indicates the warning code.
325    #[prost(enumeration="scan_run_warning_trace::Code", tag="1")]
326    pub code: i32,
327}
328pub mod scan_run_warning_trace {
329    /// Output only.
330    /// Defines a warning message code.
331    /// Next id: 6
332    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
333    #[repr(i32)]
334    pub enum Code {
335        /// Default value is never used.
336        Unspecified = 0,
337        /// Indicates that a scan discovered an unexpectedly low number of URLs. This
338        /// is sometimes caused by complex navigation features or by using a single
339        /// URL for numerous pages.
340        InsufficientCrawlResults = 1,
341        /// Indicates that a scan discovered too many URLs to test, or excessive
342        /// redundant URLs.
343        TooManyCrawlResults = 2,
344        /// Indicates that too many tests have been generated for the scan. Customer
345        /// should try reducing the number of starting URLs, increasing the QPS rate,
346        /// or narrowing down the scope of the scan using the excluded patterns.
347        TooManyFuzzTasks = 3,
348        /// Indicates that a scan is blocked by IAP.
349        BlockedByIap = 4,
350    }
351}
352/// A ScanRun is a output-only resource representing an actual run of the scan.
353/// Next id: 12
354#[derive(Clone, PartialEq, ::prost::Message)]
355pub struct ScanRun {
356    /// The resource name of the ScanRun. The name follows the format of
357    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
358    /// The ScanRun IDs are generated by the system.
359    #[prost(string, tag="1")]
360    pub name: std::string::String,
361    /// The execution state of the ScanRun.
362    #[prost(enumeration="scan_run::ExecutionState", tag="2")]
363    pub execution_state: i32,
364    /// The result state of the ScanRun. This field is only available after the
365    /// execution state reaches "FINISHED".
366    #[prost(enumeration="scan_run::ResultState", tag="3")]
367    pub result_state: i32,
368    /// The time at which the ScanRun started.
369    #[prost(message, optional, tag="4")]
370    pub start_time: ::std::option::Option<::prost_types::Timestamp>,
371    /// The time at which the ScanRun reached termination state - that the ScanRun
372    /// is either finished or stopped by user.
373    #[prost(message, optional, tag="5")]
374    pub end_time: ::std::option::Option<::prost_types::Timestamp>,
375    /// The number of URLs crawled during this ScanRun. If the scan is in progress,
376    /// the value represents the number of URLs crawled up to now.
377    #[prost(int64, tag="6")]
378    pub urls_crawled_count: i64,
379    /// The number of URLs tested during this ScanRun. If the scan is in progress,
380    /// the value represents the number of URLs tested up to now. The number of
381    /// URLs tested is usually larger than the number URLS crawled because
382    /// typically a crawled URL is tested with multiple test payloads.
383    #[prost(int64, tag="7")]
384    pub urls_tested_count: i64,
385    /// Whether the scan run has found any vulnerabilities.
386    #[prost(bool, tag="8")]
387    pub has_vulnerabilities: bool,
388    /// The percentage of total completion ranging from 0 to 100.
389    /// If the scan is in queue, the value is 0.
390    /// If the scan is running, the value ranges from 0 to 100.
391    /// If the scan is finished, the value is 100.
392    #[prost(int32, tag="9")]
393    pub progress_percent: i32,
394    /// If result_state is an ERROR, this field provides the primary reason for
395    /// scan's termination and more details, if such are available.
396    #[prost(message, optional, tag="10")]
397    pub error_trace: ::std::option::Option<ScanRunErrorTrace>,
398    /// A list of warnings, if such are encountered during this scan run.
399    #[prost(message, repeated, tag="11")]
400    pub warning_traces: ::std::vec::Vec<ScanRunWarningTrace>,
401}
402pub mod scan_run {
403    /// Types of ScanRun execution state.
404    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
405    #[repr(i32)]
406    pub enum ExecutionState {
407        /// Represents an invalid state caused by internal server error. This value
408        /// should never be returned.
409        Unspecified = 0,
410        /// The scan is waiting in the queue.
411        Queued = 1,
412        /// The scan is in progress.
413        Scanning = 2,
414        /// The scan is either finished or stopped by user.
415        Finished = 3,
416    }
417    /// Types of ScanRun result state.
418    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
419    #[repr(i32)]
420    pub enum ResultState {
421        /// Default value. This value is returned when the ScanRun is not yet
422        /// finished.
423        Unspecified = 0,
424        /// The scan finished without errors.
425        Success = 1,
426        /// The scan finished with errors.
427        Error = 2,
428        /// The scan was terminated by user.
429        Killed = 3,
430    }
431}
432/// A ScanConfig resource contains the configurations to launch a scan.
433#[derive(Clone, PartialEq, ::prost::Message)]
434pub struct ScanConfig {
435    /// The resource name of the ScanConfig. The name follows the format of
436    /// 'projects/{projectId}/scanConfigs/{scanConfigId}'. The ScanConfig IDs are
437    /// generated by the system.
438    #[prost(string, tag="1")]
439    pub name: std::string::String,
440    /// Required. The user provided display name of the ScanConfig.
441    #[prost(string, tag="2")]
442    pub display_name: std::string::String,
443    /// The maximum QPS during scanning. A valid value ranges from 5 to 20
444    /// inclusively. If the field is unspecified or its value is set 0, server will
445    /// default to 15. Other values outside of [5, 20] range will be rejected with
446    /// INVALID_ARGUMENT error.
447    #[prost(int32, tag="3")]
448    pub max_qps: i32,
449    /// Required. The starting URLs from which the scanner finds site pages.
450    #[prost(string, repeated, tag="4")]
451    pub starting_urls: ::std::vec::Vec<std::string::String>,
452    /// The authentication configuration. If specified, service will use the
453    /// authentication configuration during scanning.
454    #[prost(message, optional, tag="5")]
455    pub authentication: ::std::option::Option<scan_config::Authentication>,
456    /// The user agent used during scanning.
457    #[prost(enumeration="scan_config::UserAgent", tag="6")]
458    pub user_agent: i32,
459    /// The blacklist URL patterns as described in
460    /// https://cloud.google.com/security-scanner/docs/excluded-urls
461    #[prost(string, repeated, tag="7")]
462    pub blacklist_patterns: ::std::vec::Vec<std::string::String>,
463    /// The schedule of the ScanConfig.
464    #[prost(message, optional, tag="8")]
465    pub schedule: ::std::option::Option<scan_config::Schedule>,
466    /// Set of Cloud Platforms targeted by the scan. If empty, APP_ENGINE will be
467    /// used as a default.
468    #[prost(enumeration="scan_config::TargetPlatform", repeated, tag="9")]
469    pub target_platforms: ::std::vec::Vec<i32>,
470    /// Controls export of scan configurations and results to Cloud Security
471    /// Command Center.
472    #[prost(enumeration="scan_config::ExportToSecurityCommandCenter", tag="10")]
473    pub export_to_security_command_center: i32,
474    /// Latest ScanRun if available.
475    #[prost(message, optional, tag="11")]
476    pub latest_run: ::std::option::Option<ScanRun>,
477    /// The risk level selected for the scan
478    #[prost(enumeration="scan_config::RiskLevel", tag="12")]
479    pub risk_level: i32,
480}
481pub mod scan_config {
482    /// Scan authentication configuration.
483    #[derive(Clone, PartialEq, ::prost::Message)]
484    pub struct Authentication {
485        /// Required.
486        /// Authentication configuration
487        #[prost(oneof="authentication::Authentication", tags="1, 2")]
488        pub authentication: ::std::option::Option<authentication::Authentication>,
489    }
490    pub mod authentication {
491        /// Describes authentication configuration that uses a Google account.
492        #[derive(Clone, PartialEq, ::prost::Message)]
493        pub struct GoogleAccount {
494            /// Required. The user name of the Google account.
495            #[prost(string, tag="1")]
496            pub username: std::string::String,
497            /// Required. Input only. The password of the Google account. The credential is stored encrypted
498            /// and not returned in any response nor included in audit logs.
499            #[prost(string, tag="2")]
500            pub password: std::string::String,
501        }
502        /// Describes authentication configuration that uses a custom account.
503        #[derive(Clone, PartialEq, ::prost::Message)]
504        pub struct CustomAccount {
505            /// Required. The user name of the custom account.
506            #[prost(string, tag="1")]
507            pub username: std::string::String,
508            /// Required. Input only. The password of the custom account. The credential is stored encrypted
509            /// and not returned in any response nor included in audit logs.
510            #[prost(string, tag="2")]
511            pub password: std::string::String,
512            /// Required. The login form URL of the website.
513            #[prost(string, tag="3")]
514            pub login_url: std::string::String,
515        }
516        /// Required.
517        /// Authentication configuration
518        #[derive(Clone, PartialEq, ::prost::Oneof)]
519        pub enum Authentication {
520            /// Authentication using a Google account.
521            #[prost(message, tag="1")]
522            GoogleAccount(GoogleAccount),
523            /// Authentication using a custom account.
524            #[prost(message, tag="2")]
525            CustomAccount(CustomAccount),
526        }
527    }
528    /// Scan schedule configuration.
529    #[derive(Clone, PartialEq, ::prost::Message)]
530    pub struct Schedule {
531        /// A timestamp indicates when the next run will be scheduled. The value is
532        /// refreshed by the server after each run. If unspecified, it will default
533        /// to current server time, which means the scan will be scheduled to start
534        /// immediately.
535        #[prost(message, optional, tag="1")]
536        pub schedule_time: ::std::option::Option<::prost_types::Timestamp>,
537        /// Required. The duration of time between executions in days.
538        #[prost(int32, tag="2")]
539        pub interval_duration_days: i32,
540    }
541    /// Type of user agents used for scanning.
542    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
543    #[repr(i32)]
544    pub enum UserAgent {
545        /// The user agent is unknown. Service will default to CHROME_LINUX.
546        Unspecified = 0,
547        /// Chrome on Linux. This is the service default if unspecified.
548        ChromeLinux = 1,
549        /// Chrome on Android.
550        ChromeAndroid = 2,
551        /// Safari on IPhone.
552        SafariIphone = 3,
553    }
554    /// Cloud platforms supported by Cloud Web Security Scanner.
555    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
556    #[repr(i32)]
557    pub enum TargetPlatform {
558        /// The target platform is unknown. Requests with this enum value will be
559        /// rejected with INVALID_ARGUMENT error.
560        Unspecified = 0,
561        /// Google App Engine service.
562        AppEngine = 1,
563        /// Google Compute Engine service.
564        Compute = 2,
565    }
566    /// Scan risk levels supported by Cloud Web Security Scanner. LOW impact
567    /// scanning will minimize requests with the potential to modify data. To
568    /// achieve the maximum scan coverage, NORMAL risk level is recommended.
569    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
570    #[repr(i32)]
571    pub enum RiskLevel {
572        /// Use default, which is NORMAL.
573        Unspecified = 0,
574        /// Normal scanning (Recommended)
575        Normal = 1,
576        /// Lower impact scanning
577        Low = 2,
578    }
579    /// Controls export of scan configurations and results to Cloud Security
580    /// Command Center.
581    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
582    #[repr(i32)]
583    pub enum ExportToSecurityCommandCenter {
584        /// Use default, which is ENABLED.
585        Unspecified = 0,
586        /// Export results of this scan to Cloud Security Command Center.
587        Enabled = 1,
588        /// Do not export results of this scan to Cloud Security Command Center.
589        Disabled = 2,
590    }
591}
592/// A CrawledUrl resource represents a URL that was crawled during a ScanRun. Web
593/// Security Scanner Service crawls the web applications, following all links
594/// within the scope of sites, to find the URLs to test against.
595#[derive(Clone, PartialEq, ::prost::Message)]
596pub struct CrawledUrl {
597    /// The http method of the request that was used to visit the URL, in
598    /// uppercase.
599    #[prost(string, tag="1")]
600    pub http_method: std::string::String,
601    /// The URL that was crawled.
602    #[prost(string, tag="2")]
603    pub url: std::string::String,
604    /// The body of the request that was used to visit the URL.
605    #[prost(string, tag="3")]
606    pub body: std::string::String,
607}
608/// Request for the `CreateScanConfig` method.
609#[derive(Clone, PartialEq, ::prost::Message)]
610pub struct CreateScanConfigRequest {
611    /// Required. The parent resource name where the scan is created, which should be a
612    /// project resource name in the format 'projects/{projectId}'.
613    #[prost(string, tag="1")]
614    pub parent: std::string::String,
615    /// Required. The ScanConfig to be created.
616    #[prost(message, optional, tag="2")]
617    pub scan_config: ::std::option::Option<ScanConfig>,
618}
619/// Request for the `DeleteScanConfig` method.
620#[derive(Clone, PartialEq, ::prost::Message)]
621pub struct DeleteScanConfigRequest {
622    /// Required. The resource name of the ScanConfig to be deleted. The name follows the
623    /// format of 'projects/{projectId}/scanConfigs/{scanConfigId}'.
624    #[prost(string, tag="1")]
625    pub name: std::string::String,
626}
627/// Request for the `GetScanConfig` method.
628#[derive(Clone, PartialEq, ::prost::Message)]
629pub struct GetScanConfigRequest {
630    /// Required. The resource name of the ScanConfig to be returned. The name follows the
631    /// format of 'projects/{projectId}/scanConfigs/{scanConfigId}'.
632    #[prost(string, tag="1")]
633    pub name: std::string::String,
634}
635/// Request for the `ListScanConfigs` method.
636#[derive(Clone, PartialEq, ::prost::Message)]
637pub struct ListScanConfigsRequest {
638    /// Required. The parent resource name, which should be a project resource name in the
639    /// format 'projects/{projectId}'.
640    #[prost(string, tag="1")]
641    pub parent: std::string::String,
642    /// A token identifying a page of results to be returned. This should be a
643    /// `next_page_token` value returned from a previous List request.
644    /// If unspecified, the first page of results is returned.
645    #[prost(string, tag="2")]
646    pub page_token: std::string::String,
647    /// The maximum number of ScanConfigs to return, can be limited by server.
648    /// If not specified or not positive, the implementation will select a
649    /// reasonable value.
650    #[prost(int32, tag="3")]
651    pub page_size: i32,
652}
653/// Request for the `UpdateScanConfigRequest` method.
654#[derive(Clone, PartialEq, ::prost::Message)]
655pub struct UpdateScanConfigRequest {
656    /// Required. The ScanConfig to be updated. The name field must be set to identify the
657    /// resource to be updated. The values of fields not covered by the mask
658    /// will be ignored.
659    #[prost(message, optional, tag="2")]
660    pub scan_config: ::std::option::Option<ScanConfig>,
661    /// Required. The update mask applies to the resource. For the `FieldMask` definition,
662    /// see
663    /// https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
664    #[prost(message, optional, tag="3")]
665    pub update_mask: ::std::option::Option<::prost_types::FieldMask>,
666}
667/// Response for the `ListScanConfigs` method.
668#[derive(Clone, PartialEq, ::prost::Message)]
669pub struct ListScanConfigsResponse {
670    /// The list of ScanConfigs returned.
671    #[prost(message, repeated, tag="1")]
672    pub scan_configs: ::std::vec::Vec<ScanConfig>,
673    /// Token to retrieve the next page of results, or empty if there are no
674    /// more results in the list.
675    #[prost(string, tag="2")]
676    pub next_page_token: std::string::String,
677}
678/// Request for the `StartScanRun` method.
679#[derive(Clone, PartialEq, ::prost::Message)]
680pub struct StartScanRunRequest {
681    /// Required. The resource name of the ScanConfig to be used. The name follows the
682    /// format of 'projects/{projectId}/scanConfigs/{scanConfigId}'.
683    #[prost(string, tag="1")]
684    pub name: std::string::String,
685}
686/// Request for the `GetScanRun` method.
687#[derive(Clone, PartialEq, ::prost::Message)]
688pub struct GetScanRunRequest {
689    /// Required. The resource name of the ScanRun to be returned. The name follows the
690    /// format of
691    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
692    #[prost(string, tag="1")]
693    pub name: std::string::String,
694}
695/// Request for the `ListScanRuns` method.
696#[derive(Clone, PartialEq, ::prost::Message)]
697pub struct ListScanRunsRequest {
698    /// Required. The parent resource name, which should be a scan resource name in the
699    /// format 'projects/{projectId}/scanConfigs/{scanConfigId}'.
700    #[prost(string, tag="1")]
701    pub parent: std::string::String,
702    /// A token identifying a page of results to be returned. This should be a
703    /// `next_page_token` value returned from a previous List request.
704    /// If unspecified, the first page of results is returned.
705    #[prost(string, tag="2")]
706    pub page_token: std::string::String,
707    /// The maximum number of ScanRuns to return, can be limited by server.
708    /// If not specified or not positive, the implementation will select a
709    /// reasonable value.
710    #[prost(int32, tag="3")]
711    pub page_size: i32,
712}
713/// Response for the `ListScanRuns` method.
714#[derive(Clone, PartialEq, ::prost::Message)]
715pub struct ListScanRunsResponse {
716    /// The list of ScanRuns returned.
717    #[prost(message, repeated, tag="1")]
718    pub scan_runs: ::std::vec::Vec<ScanRun>,
719    /// Token to retrieve the next page of results, or empty if there are no
720    /// more results in the list.
721    #[prost(string, tag="2")]
722    pub next_page_token: std::string::String,
723}
724/// Request for the `StopScanRun` method.
725#[derive(Clone, PartialEq, ::prost::Message)]
726pub struct StopScanRunRequest {
727    /// Required. The resource name of the ScanRun to be stopped. The name follows the
728    /// format of
729    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
730    #[prost(string, tag="1")]
731    pub name: std::string::String,
732}
733/// Request for the `ListCrawledUrls` method.
734#[derive(Clone, PartialEq, ::prost::Message)]
735pub struct ListCrawledUrlsRequest {
736    /// Required. The parent resource name, which should be a scan run resource name in the
737    /// format
738    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
739    #[prost(string, tag="1")]
740    pub parent: std::string::String,
741    /// A token identifying a page of results to be returned. This should be a
742    /// `next_page_token` value returned from a previous List request.
743    /// If unspecified, the first page of results is returned.
744    #[prost(string, tag="2")]
745    pub page_token: std::string::String,
746    /// The maximum number of CrawledUrls to return, can be limited by server.
747    /// If not specified or not positive, the implementation will select a
748    /// reasonable value.
749    #[prost(int32, tag="3")]
750    pub page_size: i32,
751}
752/// Response for the `ListCrawledUrls` method.
753#[derive(Clone, PartialEq, ::prost::Message)]
754pub struct ListCrawledUrlsResponse {
755    /// The list of CrawledUrls returned.
756    #[prost(message, repeated, tag="1")]
757    pub crawled_urls: ::std::vec::Vec<CrawledUrl>,
758    /// Token to retrieve the next page of results, or empty if there are no
759    /// more results in the list.
760    #[prost(string, tag="2")]
761    pub next_page_token: std::string::String,
762}
763/// Request for the `GetFinding` method.
764#[derive(Clone, PartialEq, ::prost::Message)]
765pub struct GetFindingRequest {
766    /// Required. The resource name of the Finding to be returned. The name follows the
767    /// format of
768    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}/findings/{findingId}'.
769    #[prost(string, tag="1")]
770    pub name: std::string::String,
771}
772/// Request for the `ListFindings` method.
773#[derive(Clone, PartialEq, ::prost::Message)]
774pub struct ListFindingsRequest {
775    /// Required. The parent resource name, which should be a scan run resource name in the
776    /// format
777    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
778    #[prost(string, tag="1")]
779    pub parent: std::string::String,
780    /// Required. The filter expression. The expression must be in the format: <field>
781    /// <operator> <value>.
782    /// Supported field: 'finding_type'.
783    /// Supported operator: '='.
784    #[prost(string, tag="2")]
785    pub filter: std::string::String,
786    /// A token identifying a page of results to be returned. This should be a
787    /// `next_page_token` value returned from a previous List request.
788    /// If unspecified, the first page of results is returned.
789    #[prost(string, tag="3")]
790    pub page_token: std::string::String,
791    /// The maximum number of Findings to return, can be limited by server.
792    /// If not specified or not positive, the implementation will select a
793    /// reasonable value.
794    #[prost(int32, tag="4")]
795    pub page_size: i32,
796}
797/// Response for the `ListFindings` method.
798#[derive(Clone, PartialEq, ::prost::Message)]
799pub struct ListFindingsResponse {
800    /// The list of Findings returned.
801    #[prost(message, repeated, tag="1")]
802    pub findings: ::std::vec::Vec<Finding>,
803    /// Token to retrieve the next page of results, or empty if there are no
804    /// more results in the list.
805    #[prost(string, tag="2")]
806    pub next_page_token: std::string::String,
807}
808/// Request for the `ListFindingTypeStats` method.
809#[derive(Clone, PartialEq, ::prost::Message)]
810pub struct ListFindingTypeStatsRequest {
811    /// Required. The parent resource name, which should be a scan run resource name in the
812    /// format
813    /// 'projects/{projectId}/scanConfigs/{scanConfigId}/scanRuns/{scanRunId}'.
814    #[prost(string, tag="1")]
815    pub parent: std::string::String,
816}
817/// Response for the `ListFindingTypeStats` method.
818#[derive(Clone, PartialEq, ::prost::Message)]
819pub struct ListFindingTypeStatsResponse {
820    /// The list of FindingTypeStats returned.
821    #[prost(message, repeated, tag="1")]
822    pub finding_type_stats: ::std::vec::Vec<FindingTypeStats>,
823}
824# [ doc = r" Generated client implementations." ] pub mod web_security_scanner_client { # ! [ allow ( unused_variables , dead_code , missing_docs ) ] use tonic :: codegen :: * ; # [ doc = " Cloud Web Security Scanner Service identifies security vulnerabilities in web" ] # [ doc = " applications hosted on Google Cloud Platform. It crawls your application, and" ] # [ doc = " attempts to exercise as many user inputs and event handlers as possible." ] pub struct WebSecurityScannerClient < T > { inner : tonic :: client :: Grpc < T > , } impl < T > WebSecurityScannerClient < T > where T : tonic :: client :: GrpcService < tonic :: body :: BoxBody > , T :: ResponseBody : Body + HttpBody + Send + 'static , T :: Error : Into < StdError > , < T :: ResponseBody as HttpBody > :: Error : Into < StdError > + Send , { pub fn new ( inner : T ) -> Self { let inner = tonic :: client :: Grpc :: new ( inner ) ; Self { inner } } pub fn with_interceptor ( inner : T , interceptor : impl Into < tonic :: Interceptor > ) -> Self { let inner = tonic :: client :: Grpc :: with_interceptor ( inner , interceptor ) ; Self { inner } } # [ doc = " Creates a new ScanConfig." ] pub async fn create_scan_config ( & mut self , request : impl tonic :: IntoRequest < super :: CreateScanConfigRequest > , ) -> Result < tonic :: Response < super :: ScanConfig > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/CreateScanConfig" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Deletes an existing ScanConfig and its child resources." ] pub async fn delete_scan_config ( & mut self , request : impl tonic :: IntoRequest < super :: DeleteScanConfigRequest > , ) -> Result < tonic :: Response < ( ) > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/DeleteScanConfig" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Gets a ScanConfig." ] pub async fn get_scan_config ( & mut self , request : impl tonic :: IntoRequest < super :: GetScanConfigRequest > , ) -> Result < tonic :: Response < super :: ScanConfig > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/GetScanConfig" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Lists ScanConfigs under a given project." ] pub async fn list_scan_configs ( & mut self , request : impl tonic :: IntoRequest < super :: ListScanConfigsRequest > , ) -> Result < tonic :: Response < super :: ListScanConfigsResponse > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/ListScanConfigs" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Updates a ScanConfig. This method support partial update of a ScanConfig." ] pub async fn update_scan_config ( & mut self , request : impl tonic :: IntoRequest < super :: UpdateScanConfigRequest > , ) -> Result < tonic :: Response < super :: ScanConfig > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/UpdateScanConfig" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Start a ScanRun according to the given ScanConfig." ] pub async fn start_scan_run ( & mut self , request : impl tonic :: IntoRequest < super :: StartScanRunRequest > , ) -> Result < tonic :: Response < super :: ScanRun > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/StartScanRun" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Gets a ScanRun." ] pub async fn get_scan_run ( & mut self , request : impl tonic :: IntoRequest < super :: GetScanRunRequest > , ) -> Result < tonic :: Response < super :: ScanRun > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/GetScanRun" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Lists ScanRuns under a given ScanConfig, in descending order of ScanRun" ] # [ doc = " stop time." ] pub async fn list_scan_runs ( & mut self , request : impl tonic :: IntoRequest < super :: ListScanRunsRequest > , ) -> Result < tonic :: Response < super :: ListScanRunsResponse > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/ListScanRuns" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Stops a ScanRun. The stopped ScanRun is returned." ] pub async fn stop_scan_run ( & mut self , request : impl tonic :: IntoRequest < super :: StopScanRunRequest > , ) -> Result < tonic :: Response < super :: ScanRun > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/StopScanRun" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " List CrawledUrls under a given ScanRun." ] pub async fn list_crawled_urls ( & mut self , request : impl tonic :: IntoRequest < super :: ListCrawledUrlsRequest > , ) -> Result < tonic :: Response < super :: ListCrawledUrlsResponse > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/ListCrawledUrls" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " Gets a Finding." ] pub async fn get_finding ( & mut self , request : impl tonic :: IntoRequest < super :: GetFindingRequest > , ) -> Result < tonic :: Response < super :: Finding > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/GetFinding" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " List Findings under a given ScanRun." ] pub async fn list_findings ( & mut self , request : impl tonic :: IntoRequest < super :: ListFindingsRequest > , ) -> Result < tonic :: Response < super :: ListFindingsResponse > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/ListFindings" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } # [ doc = " List all FindingTypeStats under a given ScanRun." ] pub async fn list_finding_type_stats ( & mut self , request : impl tonic :: IntoRequest < super :: ListFindingTypeStatsRequest > , ) -> Result < tonic :: Response < super :: ListFindingTypeStatsResponse > , tonic :: Status > { self . inner . ready ( ) . await . map_err ( | e | { tonic :: Status :: new ( tonic :: Code :: Unknown , format ! ( "Service was not ready: {}" , e . into ( ) ) ) } ) ? ; let codec = tonic :: codec :: ProstCodec :: default ( ) ; let path = http :: uri :: PathAndQuery :: from_static ( "/google.cloud.websecurityscanner.v1beta.WebSecurityScanner/ListFindingTypeStats" ) ; self . inner . unary ( request . into_request ( ) , path , codec ) . await } } impl < T : Clone > Clone for WebSecurityScannerClient < T > { fn clone ( & self ) -> Self { Self { inner : self . inner . clone ( ) , } } } impl < T > std :: fmt :: Debug for WebSecurityScannerClient < T > { fn fmt ( & self , f : & mut std :: fmt :: Formatter < '_ > ) -> std :: fmt :: Result { write ! ( f , "WebSecurityScannerClient {{ ... }}" ) } } }use serde :: { Serialize , Deserialize } ;