Skip to main content

aws_sdk_codecatalyst/operation/
list_workflows.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/// Orchestration and serialization glue logic for `ListWorkflows`.
3#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)]
4#[non_exhaustive]
5pub struct ListWorkflows;
6impl ListWorkflows {
7    /// Creates a new `ListWorkflows`
8    pub fn new() -> Self {
9        Self
10    }
11    pub(crate) async fn orchestrate(
12        runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
13        input: crate::operation::list_workflows::ListWorkflowsInput,
14    ) -> ::std::result::Result<
15        crate::operation::list_workflows::ListWorkflowsOutput,
16        ::aws_smithy_runtime_api::client::result::SdkError<
17            crate::operation::list_workflows::ListWorkflowsError,
18            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
19        >,
20    > {
21        let map_err = |err: ::aws_smithy_runtime_api::client::result::SdkError<
22            ::aws_smithy_runtime_api::client::interceptors::context::Error,
23            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
24        >| {
25            err.map_service_error(|err| {
26                err.downcast::<crate::operation::list_workflows::ListWorkflowsError>()
27                    .expect("correct error type")
28            })
29        };
30        let context = Self::orchestrate_with_stop_point(runtime_plugins, input, ::aws_smithy_runtime::client::orchestrator::StopPoint::None)
31            .await
32            .map_err(map_err)?;
33        let output = context.finalize().map_err(map_err)?;
34        ::std::result::Result::Ok(
35            output
36                .downcast::<crate::operation::list_workflows::ListWorkflowsOutput>()
37                .expect("correct output type"),
38        )
39    }
40
41    pub(crate) async fn orchestrate_with_stop_point(
42        runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
43        input: crate::operation::list_workflows::ListWorkflowsInput,
44        stop_point: ::aws_smithy_runtime::client::orchestrator::StopPoint,
45    ) -> ::std::result::Result<
46        ::aws_smithy_runtime_api::client::interceptors::context::InterceptorContext,
47        ::aws_smithy_runtime_api::client::result::SdkError<
48            ::aws_smithy_runtime_api::client::interceptors::context::Error,
49            ::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
50        >,
51    > {
52        let input = ::aws_smithy_runtime_api::client::interceptors::context::Input::erase(input);
53        use ::tracing::Instrument;
54        ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point("CodeCatalyst", "ListWorkflows", input, runtime_plugins, stop_point)
55            // Create a parent span for the entire operation. Includes a random, internal-only,
56            // seven-digit ID for the operation orchestration so that it can be correlated in the logs.
57            .instrument(::tracing::debug_span!(
58                "CodeCatalyst.ListWorkflows",
59                "rpc.service" = "CodeCatalyst",
60                "rpc.method" = "ListWorkflows",
61                "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000),
62                "rpc.system" = "aws-api",
63            ))
64            .await
65    }
66
67    pub(crate) fn operation_runtime_plugins(
68        client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins,
69        client_config: &crate::config::Config,
70        config_override: ::std::option::Option<crate::config::Builder>,
71    ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins {
72        let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());
73
74        if let ::std::option::Option::Some(config_override) = config_override {
75            for plugin in config_override.runtime_plugins.iter().cloned() {
76                runtime_plugins = runtime_plugins.with_operation_plugin(plugin);
77            }
78            runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin::new(
79                config_override,
80                client_config.config.clone(),
81                &client_config.runtime_components,
82            ));
83        }
84        runtime_plugins
85    }
86}
87impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for ListWorkflows {
88    fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> {
89        let mut cfg = ::aws_smithy_types::config_bag::Layer::new("ListWorkflows");
90
91        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(
92            ListWorkflowsRequestSerializer,
93        ));
94        cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(
95            ListWorkflowsResponseDeserializer,
96        ));
97
98        cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(
99            crate::config::auth::Params::builder()
100                .operation_name("ListWorkflows")
101                .build()
102                .expect("required fields set"),
103        ));
104
105        cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new(
106            "ListWorkflows",
107            "CodeCatalyst",
108        ));
109
110        ::std::option::Option::Some(cfg.freeze())
111    }
112
113    fn runtime_components(
114        &self,
115        _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,
116    ) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> {
117        #[allow(unused_mut)]
118        let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("ListWorkflows")
119            .with_interceptor(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::permanent(
120                ::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default(),
121            ))
122            .with_interceptor(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::permanent(
123                ListWorkflowsEndpointParamsInterceptor,
124            ))
125            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::<
126                crate::operation::list_workflows::ListWorkflowsError,
127            >::new())
128            .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::<
129                crate::operation::list_workflows::ListWorkflowsError,
130            >::new())
131            .with_retry_classifier(::aws_runtime::retries::classifiers::AwsErrorCodeClassifier::<
132                crate::operation::list_workflows::ListWorkflowsError,
133            >::new());
134
135        ::std::borrow::Cow::Owned(rcb)
136    }
137}
138
139#[derive(Debug)]
140struct ListWorkflowsResponseDeserializer;
141impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for ListWorkflowsResponseDeserializer {
142    fn deserialize_nonstreaming(
143        &self,
144        response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
145    ) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError {
146        let (success, status) = (response.status().is_success(), response.status().as_u16());
147        let headers = response.headers();
148        let body = response.body().bytes().expect("body loaded");
149        #[allow(unused_mut)]
150        let mut force_error = false;
151        ::tracing::debug!(request_id = ?::aws_types::request_id::RequestId::request_id(response));
152        let parse_result = if !success && status != 200 || force_error {
153            crate::protocol_serde::shape_list_workflows::de_list_workflows_http_error(status, headers, body)
154        } else {
155            crate::protocol_serde::shape_list_workflows::de_list_workflows_http_response(status, headers, body)
156        };
157        crate::protocol_serde::type_erase_result(parse_result)
158    }
159}
160#[derive(Debug)]
161struct ListWorkflowsRequestSerializer;
162impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for ListWorkflowsRequestSerializer {
163    #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]
164    fn serialize_input(
165        &self,
166        input: ::aws_smithy_runtime_api::client::interceptors::context::Input,
167        _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
168    ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> {
169        let input = input
170            .downcast::<crate::operation::list_workflows::ListWorkflowsInput>()
171            .expect("correct type");
172        let _header_serialization_settings = _cfg
173            .load::<crate::serialization_settings::HeaderSerializationSettings>()
174            .cloned()
175            .unwrap_or_default();
176        let mut request_builder = {
177            #[allow(clippy::uninlined_format_args)]
178            fn uri_base(
179                _input: &crate::operation::list_workflows::ListWorkflowsInput,
180                output: &mut ::std::string::String,
181            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
182                use ::std::fmt::Write as _;
183                let input_1 = &_input.space_name;
184                let input_1 = input_1
185                    .as_ref()
186                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("space_name", "cannot be empty or unset"))?;
187                let space_name = ::aws_smithy_http::label::fmt_string(input_1, ::aws_smithy_http::label::EncodingStrategy::Default);
188                if space_name.is_empty() {
189                    return ::std::result::Result::Err(::aws_smithy_types::error::operation::BuildError::missing_field(
190                        "space_name",
191                        "cannot be empty or unset",
192                    ));
193                }
194                let input_2 = &_input.project_name;
195                let input_2 = input_2
196                    .as_ref()
197                    .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("project_name", "cannot be empty or unset"))?;
198                let project_name = ::aws_smithy_http::label::fmt_string(input_2, ::aws_smithy_http::label::EncodingStrategy::Default);
199                if project_name.is_empty() {
200                    return ::std::result::Result::Err(::aws_smithy_types::error::operation::BuildError::missing_field(
201                        "project_name",
202                        "cannot be empty or unset",
203                    ));
204                }
205                ::std::write!(
206                    output,
207                    "/v1/spaces/{spaceName}/projects/{projectName}/workflows",
208                    spaceName = space_name,
209                    projectName = project_name
210                )
211                .expect("formatting should succeed");
212                ::std::result::Result::Ok(())
213            }
214            fn uri_query(
215                _input: &crate::operation::list_workflows::ListWorkflowsInput,
216                mut output: &mut ::std::string::String,
217            ) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> {
218                let mut query = ::aws_smithy_http::query::Writer::new(output);
219                if let ::std::option::Option::Some(inner_3) = &_input.next_token {
220                    {
221                        query.push_kv("nextToken", &::aws_smithy_http::query::fmt_string(inner_3));
222                    }
223                }
224                if let ::std::option::Option::Some(inner_4) = &_input.max_results {
225                    {
226                        query.push_kv("maxResults", ::aws_smithy_types::primitive::Encoder::from(*inner_4).encode());
227                    }
228                }
229                ::std::result::Result::Ok(())
230            }
231            #[allow(clippy::unnecessary_wraps)]
232            fn update_http_builder(
233                input: &crate::operation::list_workflows::ListWorkflowsInput,
234                builder: ::http_1x::request::Builder,
235            ) -> ::std::result::Result<::http_1x::request::Builder, ::aws_smithy_types::error::operation::BuildError> {
236                let mut uri = ::std::string::String::new();
237                uri_base(input, &mut uri)?;
238                uri_query(input, &mut uri)?;
239                ::std::result::Result::Ok(builder.method("POST").uri(uri))
240            }
241            let mut builder = update_http_builder(&input, ::http_1x::request::Builder::new())?;
242            builder = _header_serialization_settings.set_default_header(builder, ::http_1x::header::CONTENT_TYPE, "application/json");
243            builder
244        };
245        let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_list_workflows::ser_list_workflows_input(&input)?);
246        if let Some(content_length) = body.content_length() {
247            let content_length = content_length.to_string();
248            request_builder = _header_serialization_settings.set_default_header(request_builder, ::http_1x::header::CONTENT_LENGTH, &content_length);
249        }
250        ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap())
251    }
252}
253#[derive(Debug)]
254struct ListWorkflowsEndpointParamsInterceptor;
255
256#[::aws_smithy_runtime_api::client::interceptors::dyn_dispatch_hint]
257impl ::aws_smithy_runtime_api::client::interceptors::Intercept for ListWorkflowsEndpointParamsInterceptor {
258    fn name(&self) -> &'static str {
259        "ListWorkflowsEndpointParamsInterceptor"
260    }
261
262    fn read_before_execution(
263        &self,
264        context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<
265            '_,
266            ::aws_smithy_runtime_api::client::interceptors::context::Input,
267            ::aws_smithy_runtime_api::client::interceptors::context::Output,
268            ::aws_smithy_runtime_api::client::interceptors::context::Error,
269        >,
270        cfg: &mut ::aws_smithy_types::config_bag::ConfigBag,
271    ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> {
272        let _input = context
273            .input()
274            .downcast_ref::<ListWorkflowsInput>()
275            .ok_or("failed to downcast to ListWorkflowsInput")?;
276
277        let params = crate::config::endpoint::Params::builder()
278            .set_use_fips(cfg.load::<::aws_types::endpoint_config::UseFips>().map(|ty| ty.0))
279            .set_region(cfg.load::<::aws_types::region::Region>().map(|r| r.as_ref().to_owned()))
280            .set_endpoint(cfg.load::<::aws_types::endpoint_config::EndpointUrl>().map(|ty| ty.0.clone()))
281            .build()
282            .map_err(|err| {
283                ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err)
284            })?;
285        cfg.interceptor_state()
286            .store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params));
287        ::std::result::Result::Ok(())
288    }
289}
290
291// The get_* functions below are generated from JMESPath expressions in the
292// operationContextParams trait. They target the operation's input shape.
293
294/// Error type for the `ListWorkflowsError` operation.
295#[non_exhaustive]
296#[derive(::std::fmt::Debug)]
297pub enum ListWorkflowsError {
298    /// <p>The request was denied because you don't have sufficient access to perform this action. Verify that you are a member of a role that allows this action.</p>
299    AccessDeniedException(crate::types::error::AccessDeniedException),
300    /// <p>The request was denied because the requested operation would cause a conflict with the current state of a service resource associated with the request. Another user might have updated the resource. Reload, make sure you have the latest data, and then try again.</p>
301    ConflictException(crate::types::error::ConflictException),
302    /// <p>The request was denied because the specified resource was not found. Verify that the spelling is correct and that you have access to the resource.</p>
303    ResourceNotFoundException(crate::types::error::ResourceNotFoundException),
304    /// <p>The request was denied because one or more resources has reached its limits for the tier the space belongs to. Either reduce the number of resources, or change the tier if applicable.</p>
305    ServiceQuotaExceededException(crate::types::error::ServiceQuotaExceededException),
306    /// <p>The request was denied due to request throttling.</p>
307    ThrottlingException(crate::types::error::ThrottlingException),
308    /// <p>The request was denied because an input failed to satisfy the constraints specified by the service. Check the spelling and input requirements, and then try again.</p>
309    ValidationException(crate::types::error::ValidationException),
310    /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).
311    #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \
312    variable wildcard pattern and check `.code()`:
313     \
314    &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`
315     \
316    See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-ListWorkflowsError) for what information is available for the error.")]
317    Unhandled(crate::error::sealed_unhandled::Unhandled),
318}
319impl ListWorkflowsError {
320    /// Creates the `ListWorkflowsError::Unhandled` variant from any error type.
321    pub fn unhandled(
322        err: impl ::std::convert::Into<::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>>,
323    ) -> Self {
324        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
325            source: err.into(),
326            meta: ::std::default::Default::default(),
327        })
328    }
329
330    /// Creates the `ListWorkflowsError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata).
331    pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self {
332        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
333            source: err.clone().into(),
334            meta: err,
335        })
336    }
337    ///
338    /// Returns error metadata, which includes the error code, message,
339    /// request ID, and potentially additional information.
340    ///
341    pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
342        match self {
343            Self::AccessDeniedException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
344            Self::ConflictException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
345            Self::ResourceNotFoundException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
346            Self::ServiceQuotaExceededException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
347            Self::ThrottlingException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
348            Self::ValidationException(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e),
349            Self::Unhandled(e) => &e.meta,
350        }
351    }
352    /// Returns `true` if the error kind is `ListWorkflowsError::AccessDeniedException`.
353    pub fn is_access_denied_exception(&self) -> bool {
354        matches!(self, Self::AccessDeniedException(_))
355    }
356    /// Returns `true` if the error kind is `ListWorkflowsError::ConflictException`.
357    pub fn is_conflict_exception(&self) -> bool {
358        matches!(self, Self::ConflictException(_))
359    }
360    /// Returns `true` if the error kind is `ListWorkflowsError::ResourceNotFoundException`.
361    pub fn is_resource_not_found_exception(&self) -> bool {
362        matches!(self, Self::ResourceNotFoundException(_))
363    }
364    /// Returns `true` if the error kind is `ListWorkflowsError::ServiceQuotaExceededException`.
365    pub fn is_service_quota_exceeded_exception(&self) -> bool {
366        matches!(self, Self::ServiceQuotaExceededException(_))
367    }
368    /// Returns `true` if the error kind is `ListWorkflowsError::ThrottlingException`.
369    pub fn is_throttling_exception(&self) -> bool {
370        matches!(self, Self::ThrottlingException(_))
371    }
372    /// Returns `true` if the error kind is `ListWorkflowsError::ValidationException`.
373    pub fn is_validation_exception(&self) -> bool {
374        matches!(self, Self::ValidationException(_))
375    }
376}
377impl ::std::error::Error for ListWorkflowsError {
378    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
379        match self {
380            Self::AccessDeniedException(_inner) => ::std::option::Option::Some(_inner),
381            Self::ConflictException(_inner) => ::std::option::Option::Some(_inner),
382            Self::ResourceNotFoundException(_inner) => ::std::option::Option::Some(_inner),
383            Self::ServiceQuotaExceededException(_inner) => ::std::option::Option::Some(_inner),
384            Self::ThrottlingException(_inner) => ::std::option::Option::Some(_inner),
385            Self::ValidationException(_inner) => ::std::option::Option::Some(_inner),
386            Self::Unhandled(_inner) => ::std::option::Option::Some(&*_inner.source),
387        }
388    }
389}
390impl ::std::fmt::Display for ListWorkflowsError {
391    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
392        match self {
393            Self::AccessDeniedException(_inner) => _inner.fmt(f),
394            Self::ConflictException(_inner) => _inner.fmt(f),
395            Self::ResourceNotFoundException(_inner) => _inner.fmt(f),
396            Self::ServiceQuotaExceededException(_inner) => _inner.fmt(f),
397            Self::ThrottlingException(_inner) => _inner.fmt(f),
398            Self::ValidationException(_inner) => _inner.fmt(f),
399            Self::Unhandled(_inner) => {
400                if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) {
401                    write!(f, "unhandled error ({code})")
402                } else {
403                    f.write_str("unhandled error")
404                }
405            }
406        }
407    }
408}
409impl ::aws_smithy_types::retry::ProvideErrorKind for ListWorkflowsError {
410    fn code(&self) -> ::std::option::Option<&str> {
411        ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self)
412    }
413    fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> {
414        match self {
415            Self::ThrottlingException(inner) => ::std::option::Option::Some(inner.retryable_error_kind()),
416            _ => ::std::option::Option::None,
417        }
418    }
419}
420impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for ListWorkflowsError {
421    fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata {
422        match self {
423            Self::AccessDeniedException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
424            Self::ConflictException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
425            Self::ResourceNotFoundException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
426            Self::ServiceQuotaExceededException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
427            Self::ThrottlingException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
428            Self::ValidationException(_inner) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner),
429            Self::Unhandled(_inner) => &_inner.meta,
430        }
431    }
432}
433impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for ListWorkflowsError {
434    fn create_unhandled_error(
435        source: ::std::boxed::Box<dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static>,
436        meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata>,
437    ) -> Self {
438        Self::Unhandled(crate::error::sealed_unhandled::Unhandled {
439            source,
440            meta: meta.unwrap_or_default(),
441        })
442    }
443}
444impl ::aws_types::request_id::RequestId for crate::operation::list_workflows::ListWorkflowsError {
445    fn request_id(&self) -> Option<&str> {
446        self.meta().request_id()
447    }
448}
449
450pub use crate::operation::list_workflows::_list_workflows_input::ListWorkflowsInput;
451
452pub use crate::operation::list_workflows::_list_workflows_output::ListWorkflowsOutput;
453
454mod _list_workflows_input;
455
456mod _list_workflows_output;
457
458/// Builders
459pub mod builders;
460
461/// Paginator for this operation
462pub mod paginator;