serde_dynamo/
lib.rs

1#![deny(warnings)]
2#![deny(missing_docs)]
3#![cfg_attr(docsrs, feature(doc_cfg))]
4
5//! [DynamoDB] is an AWS database that stores key/value and document data.
6//!
7//! **serde_dynamo** provides a way to serialize and deserialize between data stored in these
8//! items and strongly-typed Rust data structures.
9//!
10//!
11//! ## The full power of serde
12//!
13//! **serde_dynamo** supports the full power of [serde].
14//!
15//! Most uses of DynamoDB will involve simple structs mapping keys to values in type-safe ways.
16//!
17//! ```
18//! # use serde_derive::{Serialize, Deserialize};
19//! #
20//! #[derive(Serialize, Deserialize)]
21//! #[serde(transparent)]
22//! pub struct UserId(String);
23//!
24//! #[derive(Serialize, Deserialize)]
25//! pub struct User {
26//!     id: UserId,
27//!     name: String,
28//!     age: u8,
29//!     #[serde(with = "serde_bytes")]
30//!     public_key: Vec<u8>
31//! }
32//! ```
33//!
34//! More advanced usage – including [flattening], [adjacently tagged enums], and [untagged enums] –
35//! is fully supported.
36//!
37//! ```
38//! # use chrono::{DateTime, Utc};
39//! # use serde_derive::{Serialize, Deserialize};
40//! # use serde_dynamo::to_item;
41//! # use serde_dynamo::AttributeValue;
42//! # use std::collections::HashMap;
43//! #
44//! #[derive(Serialize, Deserialize)]
45//! struct Message {
46//!     id: String,
47//!     #[serde(flatten)]
48//!     message_type: MessageType,
49//!     sent: DateTime<Utc>,
50//! }
51//!
52//! /// What type of message this is.
53//! ///
54//! /// By the power of Rust enums and serde serializating, we can guarantee that we _either_ have
55//! /// an email with all of its required fields, _or_ an SMS with all of its required fields.
56//! #[derive(Serialize, Deserialize)]
57//! #[serde(rename_all = "snake_case", tag = "message_type", content = "message_payload")]
58//! enum MessageType {
59//!     Email(Email),
60//!     Sms(Sms),
61//! }
62//!
63//! #[derive(Serialize, Deserialize)]
64//! struct Email {
65//!     email: String,
66//!     #[serde(skip_serializing_if = "Option::is_none")]
67//!     name: Option<String>,
68//!     subject: String,
69//!     body: String,
70//! }
71//!
72//! #[derive(Serialize, Deserialize)]
73//! #[serde(rename_all = "snake_case")]
74//! struct Sms {
75//!     phone_number: String,
76//!     body: String,
77//! }
78//!
79//! # fn test() -> Result<(), Box<dyn std::error::Error>> {
80//! let input = r#"
81//! {
82//!     "id": "HWCqBFBG2Gl4",
83//!     "message_type": "sms",
84//!     "message_payload": {
85//!         "phone_number": "5551234567",
86//!         "body": "Good morning!"
87//!     },
88//!     "sent": "1985-04-21T11:12:13Z"
89//! }
90//! "#;
91//! let message: Message = serde_json::from_str(input)?;
92//! let item = to_item(message)?;
93//! # let item: serde_dynamo::Item = item;
94//! # Ok(())
95//! # }
96//! # test().unwrap()
97//! ```
98//!
99//! ## aws-sdk support
100//!
101//! **serde_dynamo** works well with [aws-sdk-dynamodb].
102//!
103//! Add the following to your dependencies.
104//!
105//! ```toml
106//! [dependencies]
107//! serde_dynamo = { version = "4", features = ["aws-sdk-dynamodb+1"] }
108//! ```
109//!
110//! See [`aws_sdk_dynamodb_1`] for examples and more information. See
111//! [`aws_sdk_dynamodbstreams_1`] for DynamoDb streams support.
112//!
113//! ## aws_lambda_events support
114//!
115//! [aws_lambda_events], starting with version 0.8, uses **serde_dynamo** directly, so no feature
116//! flags need to be enabled.
117//!
118//! ```toml
119//! [dependencies]
120//! serde_dynamo = { version = "4" }
121//! ```
122//!
123//! ## rusoto support
124//!
125//! **serde_dynamo** works well with [rusoto_dynamodb].
126//!
127//! Add the following to your dependencies.
128//!
129//! ```toml
130//! [dependencies]
131//! serde_dynamo = { version = "4", features = ["rusoto_dynamodb+0.48"] }
132//! ```
133//!
134//! See [`rusoto_dynamodb_0_48`] for examples and more information.
135//!
136//!
137//! ## JSON
138//!
139//! DynamoDB's items share strong similarities with JSON, and it is very common to store JSON data
140//! in DynamoDB either directly or as a subfield.
141//!
142//! To support this, **serde_dynamo** supports serializing JSON just like any other Rust data
143//! structure.
144//!
145//! ```
146//! # use serde_derive::{Serialize, Deserialize};
147//! #
148//! #[derive(Serialize, Deserialize)]
149//! struct IncludesJson {
150//!     id: String,
151//!     data: serde_json::Value,
152//! }
153//! ```
154//!
155//! In addition, **serde_dynamo** also maps strongly-typed data structures nearly identically as
156//! [serde_json]. This means that, in almost all cases, serializing to JSON first and then to an
157//! DynamoDb item will result in the exact same representation as serializing directly to a DynamoDb
158//! item. (The caveat here is for byte data, which loses fidelity because JSON doesn't support byte
159//! data natively, but DynamoDB does.)
160//!
161//! ```
162//! # use serde_dynamo::to_item;
163//! # use serde_derive::{Serialize, Deserialize};
164//! # use std::collections::HashMap;
165//! # use serde_dynamo::AttributeValue;
166//! #
167//! # #[derive(Clone, Serialize, Deserialize)]
168//! # struct User {
169//! #   name: String,
170//! #   age: u8,
171//! # }
172//! #
173//! # fn equivalence() -> Result<(), Box<dyn std::error::Error>> {
174//! let user = User {
175//!     name: "Arthur Dent".to_string(),
176//!     age: 42,
177//! };
178//!
179//! // Serialize directly from the data structure to an item
180//! let direct_item = to_item(user.clone())?;
181//! # let direct_item: serde_dynamo::Item = direct_item;
182//!
183//! // Serialize indirectly through JSON
184//! let json = serde_json::to_value(user.clone())?;
185//! let indirect_item = to_item(json)?;
186//! # let indirect_item: serde_dynamo::Item = indirect_item;
187//!
188//! // The result should be the same!
189//! assert_eq!(direct_item, indirect_item);
190//! # Ok(())
191//! # }
192//! ```
193//!
194//! ## Features
195//!
196//! **serde_dynamo** is a stable library ready to use in production. Because of that, it's major
197//! version is above 1.0.
198//!
199//! This creates problems when supporting dynamodb libraries that have version numbers less than
200//! 1.0.
201//!
202//! To avoid doing a major version bump for every release of `aws-sdk-dynamodb` and
203//! `aws_lambda_events`, **serde_dynamo** uses features to opt into the correct version of the
204//! dynamodb library.
205//!
206//! See the [modules](#modules) section for all possible features. Feature names are largely
207//! guessable: the library name, a plus, and the library version (with underscores instead of dots,
208//! because crates.io doesn't support feature names with dots). For example, support for
209//! `aws-sdk-dynamodb` version `0.13` is enabled with the feature `aws-sdk-dynamodb+0_13`.
210//!
211//! ## Converting to and from DynamoDB JSON
212//!
213//! In most cases, libraries already exist to handle the raw DynamoDB JSON and convert it into an
214//! item. For example, [aws-sdk-dynamodb] deals with the raw JSON if you're making API calls, and
215//! [aws_lambda_events] deals with the raw JSON if you're writing lambdas that react on DynamoDB
216//! change streams.
217//!
218//! However, in very rare cases, you may need to convert the DynamoDB JSON yourself. In those cases,
219//! both [Item] and [AttributeValue] implement [serde::Serialize] and [serde::Deserialize].
220//!
221//! ```
222//! # use serde_dynamo::{AttributeValue, Item};
223//! let input = r#"{
224//!     "Id":{
225//!         "N":"103"
226//!     },
227//!     "Title":{
228//!         "S":"Book 103 Title"
229//!     },
230//!     "Authors":{
231//!         "SS":[
232//!             "Author1",
233//!             "Author2"
234//!         ]
235//!     },
236//!     "InPublication":{
237//!         "BOOL":false
238//!     }
239//! }"#;
240//!
241//! let item: Item = serde_json::from_str(input)
242//!     .expect("expected to deserialize DynamoDB JSON format");
243//!
244//! assert_eq!(
245//!     item.get("Id").unwrap(),
246//!     &AttributeValue::N(String::from("103")),
247//! );
248//! ```
249//!
250//! [DynamoDB]: https://aws.amazon.com/dynamodb/
251//! [serde]: https://docs.rs/serde
252//! [serde_json]: https://docs.rs/serde_json
253//! [flattening]: https://serde.rs/attr-flatten.html
254//! [adjacently tagged enums]: https://serde.rs/enum-representations.html#adjacently-tagged
255//! [untagged enums]: https://serde.rs/enum-representations.html#untagged
256//! [aws-sdk-dynamodb]: https://docs.rs/aws-sdk-dynamodb
257//! [aws_lambda_events]: https://docs.rs/aws_lambda_events
258//! [rusoto_dynamodb]: https://docs.rs/rusoto_dynamodb
259
260mod attribute_value;
261mod de;
262mod error;
263mod macros;
264mod ser;
265
266pub mod binary_set;
267pub mod number_set;
268pub mod string_set;
269
270pub use attribute_value::{AttributeValue, Item, Items};
271pub use de::{from_attribute_value, from_item, from_items, Deserializer};
272pub use error::{Error, Result};
273use macros::{
274    aws_lambda_events_macro, aws_sdk_macro, aws_sdk_macro_before_0_35, aws_sdk_streams_macro,
275    rusoto_macro, rusoto_streams_macro,
276};
277pub use ser::{to_attribute_value, to_item, Serializer};
278
279aws_sdk_macro_before_0_35!(
280    feature = "aws-sdk-dynamodb+0_7",
281    crate_name = __aws_sdk_dynamodb_0_7,
282    mod_name = aws_sdk_dynamodb_0_7,
283    attribute_value_path = ::__aws_sdk_dynamodb_0_7::model::AttributeValue,
284    blob_path = ::__aws_sdk_dynamodb_0_7::types::Blob,
285    aws_version = "0.7",
286    config_version = "0.7",
287);
288
289aws_sdk_macro_before_0_35!(
290    feature = "aws-sdk-dynamodb+0_8",
291    crate_name = __aws_sdk_dynamodb_0_8,
292    mod_name = aws_sdk_dynamodb_0_8,
293    attribute_value_path = ::__aws_sdk_dynamodb_0_8::model::AttributeValue,
294    blob_path = ::__aws_sdk_dynamodb_0_8::types::Blob,
295    aws_version = "0.8",
296    config_version = "0.8",
297);
298
299aws_sdk_macro_before_0_35!(
300    feature = "aws-sdk-dynamodb+0_9",
301    crate_name = __aws_sdk_dynamodb_0_9,
302    mod_name = aws_sdk_dynamodb_0_9,
303    attribute_value_path = ::__aws_sdk_dynamodb_0_9::model::AttributeValue,
304    blob_path = ::__aws_sdk_dynamodb_0_9::types::Blob,
305    aws_version = "0.9",
306    config_version = "0.9",
307);
308
309aws_sdk_macro_before_0_35!(
310    feature = "aws-sdk-dynamodb+0_10",
311    crate_name = __aws_sdk_dynamodb_0_10,
312    mod_name = aws_sdk_dynamodb_0_10,
313    attribute_value_path = ::__aws_sdk_dynamodb_0_10::model::AttributeValue,
314    blob_path = ::__aws_sdk_dynamodb_0_10::types::Blob,
315    aws_version = "0.10",
316    config_version = "0.40",
317);
318
319aws_sdk_macro_before_0_35!(
320    feature = "aws-sdk-dynamodb+0_11",
321    crate_name = __aws_sdk_dynamodb_0_11,
322    mod_name = aws_sdk_dynamodb_0_11,
323    attribute_value_path = ::__aws_sdk_dynamodb_0_11::model::AttributeValue,
324    blob_path = ::__aws_sdk_dynamodb_0_11::types::Blob,
325    aws_version = "0.11",
326    config_version = "0.41",
327);
328
329aws_sdk_macro_before_0_35!(
330    feature = "aws-sdk-dynamodb+0_12",
331    crate_name = __aws_sdk_dynamodb_0_12,
332    mod_name = aws_sdk_dynamodb_0_12,
333    attribute_value_path = ::__aws_sdk_dynamodb_0_12::model::AttributeValue,
334    blob_path = ::__aws_sdk_dynamodb_0_12::types::Blob,
335    aws_version = "0.12",
336    config_version = "0.42",
337);
338
339aws_sdk_macro_before_0_35!(
340    feature = "aws-sdk-dynamodb+0_13",
341    crate_name = __aws_sdk_dynamodb_0_13,
342    mod_name = aws_sdk_dynamodb_0_13,
343    attribute_value_path = ::__aws_sdk_dynamodb_0_13::model::AttributeValue,
344    blob_path = ::__aws_sdk_dynamodb_0_13::types::Blob,
345    aws_version = "0.13",
346    config_version = "0.43",
347);
348
349aws_sdk_macro_before_0_35!(
350    feature = "aws-sdk-dynamodb+0_14",
351    crate_name = __aws_sdk_dynamodb_0_14,
352    mod_name = aws_sdk_dynamodb_0_14,
353    attribute_value_path = ::__aws_sdk_dynamodb_0_14::model::AttributeValue,
354    blob_path = ::__aws_sdk_dynamodb_0_14::types::Blob,
355    aws_version = "0.14",
356    config_version = "0.44",
357);
358
359aws_sdk_macro_before_0_35!(
360    feature = "aws-sdk-dynamodb+0_15",
361    crate_name = __aws_sdk_dynamodb_0_15,
362    mod_name = aws_sdk_dynamodb_0_15,
363    attribute_value_path = ::__aws_sdk_dynamodb_0_15::model::AttributeValue,
364    blob_path = ::__aws_sdk_dynamodb_0_15::types::Blob,
365    aws_version = "0.15",
366    config_version = "0.45",
367);
368
369aws_sdk_macro_before_0_35!(
370    feature = "aws-sdk-dynamodb+0_16",
371    crate_name = __aws_sdk_dynamodb_0_16,
372    mod_name = aws_sdk_dynamodb_0_16,
373    attribute_value_path = ::__aws_sdk_dynamodb_0_16::model::AttributeValue,
374    blob_path = ::__aws_sdk_dynamodb_0_16::types::Blob,
375    aws_version = "0.16",
376    config_version = "0.46",
377);
378
379aws_sdk_macro_before_0_35!(
380    feature = "aws-sdk-dynamodb+0_17",
381    crate_name = __aws_sdk_dynamodb_0_17,
382    mod_name = aws_sdk_dynamodb_0_17,
383    attribute_value_path = ::__aws_sdk_dynamodb_0_17::model::AttributeValue,
384    blob_path = ::__aws_sdk_dynamodb_0_17::types::Blob,
385    aws_version = "0.17",
386    config_version = "0.47",
387);
388
389aws_sdk_macro_before_0_35!(
390    feature = "aws-sdk-dynamodb+0_18",
391    crate_name = __aws_sdk_dynamodb_0_18,
392    mod_name = aws_sdk_dynamodb_0_18,
393    attribute_value_path = ::__aws_sdk_dynamodb_0_18::model::AttributeValue,
394    blob_path = ::__aws_sdk_dynamodb_0_18::types::Blob,
395    aws_version = "0.18",
396    config_version = "0.48",
397);
398
399aws_sdk_macro_before_0_35!(
400    feature = "aws-sdk-dynamodb+0_19",
401    crate_name = __aws_sdk_dynamodb_0_19,
402    mod_name = aws_sdk_dynamodb_0_19,
403    attribute_value_path = ::__aws_sdk_dynamodb_0_19::model::AttributeValue,
404    blob_path = ::__aws_sdk_dynamodb_0_19::types::Blob,
405    aws_version = "0.19",
406    config_version = "0.49",
407);
408
409aws_sdk_macro_before_0_35!(
410    feature = "aws-sdk-dynamodb+0_21",
411    crate_name = __aws_sdk_dynamodb_0_21,
412    mod_name = aws_sdk_dynamodb_0_21,
413    attribute_value_path = ::__aws_sdk_dynamodb_0_21::model::AttributeValue,
414    blob_path = ::__aws_sdk_dynamodb_0_21::types::Blob,
415    aws_version = "0.21",
416    config_version = "0.51",
417);
418
419aws_sdk_macro_before_0_35!(
420    feature = "aws-sdk-dynamodb+0_22",
421    crate_name = __aws_sdk_dynamodb_0_22,
422    mod_name = aws_sdk_dynamodb_0_22,
423    attribute_value_path = ::__aws_sdk_dynamodb_0_22::model::AttributeValue,
424    blob_path = ::__aws_sdk_dynamodb_0_22::types::Blob,
425    aws_version = "0.22",
426    config_version = "0.52",
427);
428
429aws_sdk_macro_before_0_35!(
430    feature = "aws-sdk-dynamodb+0_23",
431    crate_name = __aws_sdk_dynamodb_0_23,
432    mod_name = aws_sdk_dynamodb_0_23,
433    attribute_value_path = ::__aws_sdk_dynamodb_0_23::model::AttributeValue,
434    blob_path = ::__aws_sdk_dynamodb_0_23::types::Blob,
435    aws_version = "0.23",
436    config_version = "0.53",
437);
438
439aws_sdk_macro_before_0_35!(
440    feature = "aws-sdk-dynamodb+0_24",
441    crate_name = __aws_sdk_dynamodb_0_24,
442    mod_name = aws_sdk_dynamodb_0_24,
443    attribute_value_path = ::__aws_sdk_dynamodb_0_24::model::AttributeValue,
444    blob_path = ::__aws_sdk_dynamodb_0_24::types::Blob,
445    aws_version = "0.24",
446    config_version = "0.54",
447);
448
449aws_sdk_macro_before_0_35!(
450    feature = "aws-sdk-dynamodb+0_25",
451    crate_name = __aws_sdk_dynamodb_0_25,
452    mod_name = aws_sdk_dynamodb_0_25,
453    attribute_value_path = ::__aws_sdk_dynamodb_0_25::types::AttributeValue,
454    blob_path = ::__aws_sdk_dynamodb_0_25::primitives::Blob,
455    aws_version = "0.25",
456    config_version = "0.55",
457);
458
459aws_sdk_macro_before_0_35!(
460    feature = "aws-sdk-dynamodb+0_26",
461    crate_name = __aws_sdk_dynamodb_0_26,
462    mod_name = aws_sdk_dynamodb_0_26,
463    attribute_value_path = ::__aws_sdk_dynamodb_0_26::types::AttributeValue,
464    blob_path = ::__aws_sdk_dynamodb_0_26::primitives::Blob,
465    aws_version = "0.26",
466    config_version = "0.55",
467);
468
469aws_sdk_macro_before_0_35!(
470    feature = "aws-sdk-dynamodb+0_27",
471    crate_name = __aws_sdk_dynamodb_0_27,
472    mod_name = aws_sdk_dynamodb_0_27,
473    attribute_value_path = ::__aws_sdk_dynamodb_0_27::types::AttributeValue,
474    blob_path = ::__aws_sdk_dynamodb_0_27::primitives::Blob,
475    aws_version = "0.27",
476    config_version = "0.55",
477);
478
479aws_sdk_macro_before_0_35!(
480    feature = "aws-sdk-dynamodb+0_28",
481    crate_name = __aws_sdk_dynamodb_0_28,
482    mod_name = aws_sdk_dynamodb_0_28,
483    attribute_value_path = ::__aws_sdk_dynamodb_0_28::types::AttributeValue,
484    blob_path = ::__aws_sdk_dynamodb_0_28::primitives::Blob,
485    aws_version = "0.28",
486    config_version = "0.55",
487);
488
489aws_sdk_macro_before_0_35!(
490    feature = "aws-sdk-dynamodb+0_29",
491    crate_name = __aws_sdk_dynamodb_0_29,
492    mod_name = aws_sdk_dynamodb_0_29,
493    attribute_value_path = ::__aws_sdk_dynamodb_0_29::types::AttributeValue,
494    blob_path = ::__aws_sdk_dynamodb_0_29::primitives::Blob,
495    aws_version = "0.29",
496    config_version = "0.56",
497);
498
499aws_sdk_macro_before_0_35!(
500    feature = "aws-sdk-dynamodb+0_30",
501    crate_name = __aws_sdk_dynamodb_0_30,
502    mod_name = aws_sdk_dynamodb_0_30,
503    attribute_value_path = ::__aws_sdk_dynamodb_0_30::types::AttributeValue,
504    blob_path = ::__aws_sdk_dynamodb_0_30::primitives::Blob,
505    aws_version = "0.30",
506    config_version = "0.56",
507);
508
509aws_sdk_macro_before_0_35!(
510    feature = "aws-sdk-dynamodb+0_31",
511    crate_name = __aws_sdk_dynamodb_0_31,
512    mod_name = aws_sdk_dynamodb_0_31,
513    attribute_value_path = ::__aws_sdk_dynamodb_0_31::types::AttributeValue,
514    blob_path = ::__aws_sdk_dynamodb_0_31::primitives::Blob,
515    aws_version = "0.31",
516    config_version = "0.56",
517);
518
519aws_sdk_macro_before_0_35!(
520    feature = "aws-sdk-dynamodb+0_32",
521    crate_name = __aws_sdk_dynamodb_0_32,
522    mod_name = aws_sdk_dynamodb_0_32,
523    attribute_value_path = ::__aws_sdk_dynamodb_0_32::types::AttributeValue,
524    blob_path = ::__aws_sdk_dynamodb_0_32::primitives::Blob,
525    aws_version = "0.32",
526    config_version = "0.56",
527);
528
529aws_sdk_macro_before_0_35!(
530    feature = "aws-sdk-dynamodb+0_33",
531    crate_name = __aws_sdk_dynamodb_0_33,
532    mod_name = aws_sdk_dynamodb_0_33,
533    attribute_value_path = ::__aws_sdk_dynamodb_0_33::types::AttributeValue,
534    blob_path = ::__aws_sdk_dynamodb_0_33::primitives::Blob,
535    aws_version = "0.33",
536    config_version = "0.56",
537);
538
539aws_sdk_macro_before_0_35!(
540    feature = "aws-sdk-dynamodb+0_34",
541    crate_name = __aws_sdk_dynamodb_0_34,
542    mod_name = aws_sdk_dynamodb_0_34,
543    attribute_value_path = ::__aws_sdk_dynamodb_0_34::types::AttributeValue,
544    blob_path = ::__aws_sdk_dynamodb_0_34::primitives::Blob,
545    aws_version = "0.34",
546    config_version = "0.56",
547);
548
549aws_sdk_macro!(
550    feature = "aws-sdk-dynamodb+0_35",
551    crate_name = __aws_sdk_dynamodb_0_35,
552    mod_name = aws_sdk_dynamodb_0_35,
553    attribute_value_path = ::__aws_sdk_dynamodb_0_35::types::AttributeValue,
554    blob_path = ::__aws_sdk_dynamodb_0_35::primitives::Blob,
555    aws_version = "0.35",
556    config_version = "0.56",
557);
558
559aws_sdk_macro!(
560    feature = "aws-sdk-dynamodb+0_36",
561    crate_name = __aws_sdk_dynamodb_0_36,
562    mod_name = aws_sdk_dynamodb_0_36,
563    attribute_value_path = ::__aws_sdk_dynamodb_0_36::types::AttributeValue,
564    blob_path = ::__aws_sdk_dynamodb_0_36::primitives::Blob,
565    aws_version = "0.36",
566    config_version = "0.57",
567);
568
569aws_sdk_macro!(
570    feature = "aws-sdk-dynamodb+0_37",
571    crate_name = __aws_sdk_dynamodb_0_37,
572    mod_name = aws_sdk_dynamodb_0_37,
573    attribute_value_path = ::__aws_sdk_dynamodb_0_37::types::AttributeValue,
574    blob_path = ::__aws_sdk_dynamodb_0_37::primitives::Blob,
575    aws_version = "0.37",
576    config_version = "0.100",
577);
578
579aws_sdk_macro!(
580    feature = "aws-sdk-dynamodb+0_38",
581    crate_name = __aws_sdk_dynamodb_0_38,
582    mod_name = aws_sdk_dynamodb_0_38,
583    attribute_value_path = ::__aws_sdk_dynamodb_0_38::types::AttributeValue,
584    blob_path = ::__aws_sdk_dynamodb_0_38::primitives::Blob,
585    aws_version = "0.38",
586    config_version = "0.101",
587);
588
589aws_sdk_macro!(
590    feature = "aws-sdk-dynamodb+0_39",
591    crate_name = __aws_sdk_dynamodb_0_39,
592    mod_name = aws_sdk_dynamodb_0_39,
593    attribute_value_path = ::__aws_sdk_dynamodb_0_39::types::AttributeValue,
594    blob_path = ::__aws_sdk_dynamodb_0_39::primitives::Blob,
595    aws_version = "0.39",
596    config_version = "1",
597);
598
599aws_sdk_macro!(
600    feature = "aws-sdk-dynamodb+1",
601    crate_name = __aws_sdk_dynamodb_1,
602    mod_name = aws_sdk_dynamodb_1,
603    attribute_value_path = ::__aws_sdk_dynamodb_1::types::AttributeValue,
604    blob_path = ::__aws_sdk_dynamodb_1::primitives::Blob,
605    aws_version = "1",
606    config_version = "1",
607);
608
609aws_sdk_streams_macro!(
610    feature = "aws-sdk-dynamodbstreams+0_8",
611    crate_name = __aws_sdk_dynamodbstreams_0_8,
612    mod_name = aws_sdk_dynamodbstreams_0_8,
613    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_8::model::AttributeValue,
614    blob_path = ::__aws_sdk_dynamodbstreams_0_8::types::Blob,
615    aws_version = "0.8",
616);
617
618aws_sdk_streams_macro!(
619    feature = "aws-sdk-dynamodbstreams+0_9",
620    crate_name = __aws_sdk_dynamodbstreams_0_9,
621    mod_name = aws_sdk_dynamodbstreams_0_9,
622    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_9::model::AttributeValue,
623    blob_path = ::__aws_sdk_dynamodbstreams_0_9::types::Blob,
624    aws_version = "0.9",
625);
626
627aws_sdk_streams_macro!(
628    feature = "aws-sdk-dynamodbstreams+0_10",
629    crate_name = __aws_sdk_dynamodbstreams_0_10,
630    mod_name = aws_sdk_dynamodbstreams_0_10,
631    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_10::model::AttributeValue,
632    blob_path = ::__aws_sdk_dynamodbstreams_0_10::types::Blob,
633    aws_version = "0.10",
634);
635
636aws_sdk_streams_macro!(
637    feature = "aws-sdk-dynamodbstreams+0_11",
638    crate_name = __aws_sdk_dynamodbstreams_0_11,
639    mod_name = aws_sdk_dynamodbstreams_0_11,
640    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_11::model::AttributeValue,
641    blob_path = ::__aws_sdk_dynamodbstreams_0_11::types::Blob,
642    aws_version = "0.11",
643);
644
645aws_sdk_streams_macro!(
646    feature = "aws-sdk-dynamodbstreams+0_12",
647    crate_name = __aws_sdk_dynamodbstreams_0_12,
648    mod_name = aws_sdk_dynamodbstreams_0_12,
649    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_12::model::AttributeValue,
650    blob_path = ::__aws_sdk_dynamodbstreams_0_12::types::Blob,
651    aws_version = "0.12",
652);
653
654aws_sdk_streams_macro!(
655    feature = "aws-sdk-dynamodbstreams+0_13",
656    crate_name = __aws_sdk_dynamodbstreams_0_13,
657    mod_name = aws_sdk_dynamodbstreams_0_13,
658    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_13::model::AttributeValue,
659    blob_path = ::__aws_sdk_dynamodbstreams_0_13::types::Blob,
660    aws_version = "0.13",
661);
662
663aws_sdk_streams_macro!(
664    feature = "aws-sdk-dynamodbstreams+0_14",
665    crate_name = __aws_sdk_dynamodbstreams_0_14,
666    mod_name = aws_sdk_dynamodbstreams_0_14,
667    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_14::model::AttributeValue,
668    blob_path = ::__aws_sdk_dynamodbstreams_0_14::types::Blob,
669    aws_version = "0.14",
670);
671
672aws_sdk_streams_macro!(
673    feature = "aws-sdk-dynamodbstreams+0_15",
674    crate_name = __aws_sdk_dynamodbstreams_0_15,
675    mod_name = aws_sdk_dynamodbstreams_0_15,
676    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_15::model::AttributeValue,
677    blob_path = ::__aws_sdk_dynamodbstreams_0_15::types::Blob,
678    aws_version = "0.15",
679);
680
681aws_sdk_streams_macro!(
682    feature = "aws-sdk-dynamodbstreams+0_16",
683    crate_name = __aws_sdk_dynamodbstreams_0_16,
684    mod_name = aws_sdk_dynamodbstreams_0_16,
685    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_16::model::AttributeValue,
686    blob_path = ::__aws_sdk_dynamodbstreams_0_16::types::Blob,
687    aws_version = "0.16",
688);
689
690aws_sdk_streams_macro!(
691    feature = "aws-sdk-dynamodbstreams+0_17",
692    crate_name = __aws_sdk_dynamodbstreams_0_17,
693    mod_name = aws_sdk_dynamodbstreams_0_17,
694    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_17::model::AttributeValue,
695    blob_path = ::__aws_sdk_dynamodbstreams_0_17::types::Blob,
696    aws_version = "0.17",
697);
698
699aws_sdk_streams_macro!(
700    feature = "aws-sdk-dynamodbstreams+0_18",
701    crate_name = __aws_sdk_dynamodbstreams_0_18,
702    mod_name = aws_sdk_dynamodbstreams_0_18,
703    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_18::model::AttributeValue,
704    blob_path = ::__aws_sdk_dynamodbstreams_0_18::types::Blob,
705    aws_version = "0.18",
706);
707
708aws_sdk_streams_macro!(
709    feature = "aws-sdk-dynamodbstreams+0_19",
710    crate_name = __aws_sdk_dynamodbstreams_0_19,
711    mod_name = aws_sdk_dynamodbstreams_0_19,
712    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_19::model::AttributeValue,
713    blob_path = ::__aws_sdk_dynamodbstreams_0_19::types::Blob,
714    aws_version = "0.19",
715);
716
717aws_sdk_streams_macro!(
718    feature = "aws-sdk-dynamodbstreams+0_21",
719    crate_name = __aws_sdk_dynamodbstreams_0_21,
720    mod_name = aws_sdk_dynamodbstreams_0_21,
721    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_21::model::AttributeValue,
722    blob_path = ::__aws_sdk_dynamodbstreams_0_21::types::Blob,
723    aws_version = "0.21",
724);
725
726aws_sdk_streams_macro!(
727    feature = "aws-sdk-dynamodbstreams+0_22",
728    crate_name = __aws_sdk_dynamodbstreams_0_22,
729    mod_name = aws_sdk_dynamodbstreams_0_22,
730    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_22::model::AttributeValue,
731    blob_path = ::__aws_sdk_dynamodbstreams_0_22::types::Blob,
732    aws_version = "0.22",
733);
734
735aws_sdk_streams_macro!(
736    feature = "aws-sdk-dynamodbstreams+0_23",
737    crate_name = __aws_sdk_dynamodbstreams_0_23,
738    mod_name = aws_sdk_dynamodbstreams_0_23,
739    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_23::model::AttributeValue,
740    blob_path = ::__aws_sdk_dynamodbstreams_0_23::types::Blob,
741    aws_version = "0.23",
742);
743
744aws_sdk_streams_macro!(
745    feature = "aws-sdk-dynamodbstreams+0_24",
746    crate_name = __aws_sdk_dynamodbstreams_0_24,
747    mod_name = aws_sdk_dynamodbstreams_0_24,
748    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_24::model::AttributeValue,
749    blob_path = ::__aws_sdk_dynamodbstreams_0_24::types::Blob,
750    aws_version = "0.24",
751);
752
753aws_sdk_streams_macro!(
754    feature = "aws-sdk-dynamodbstreams+0_25",
755    crate_name = __aws_sdk_dynamodbstreams_0_25,
756    mod_name = aws_sdk_dynamodbstreams_0_25,
757    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_25::types::AttributeValue,
758    blob_path = ::__aws_sdk_dynamodbstreams_0_25::primitives::Blob,
759    aws_version = "0.25",
760);
761
762aws_sdk_streams_macro!(
763    feature = "aws-sdk-dynamodbstreams+0_26",
764    crate_name = __aws_sdk_dynamodbstreams_0_26,
765    mod_name = aws_sdk_dynamodbstreams_0_26,
766    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_26::types::AttributeValue,
767    blob_path = ::__aws_sdk_dynamodbstreams_0_26::primitives::Blob,
768    aws_version = "0.26",
769);
770
771aws_sdk_streams_macro!(
772    feature = "aws-sdk-dynamodbstreams+0_27",
773    crate_name = __aws_sdk_dynamodbstreams_0_27,
774    mod_name = aws_sdk_dynamodbstreams_0_27,
775    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_27::types::AttributeValue,
776    blob_path = ::__aws_sdk_dynamodbstreams_0_27::primitives::Blob,
777    aws_version = "0.27",
778);
779
780aws_sdk_streams_macro!(
781    feature = "aws-sdk-dynamodbstreams+0_28",
782    crate_name = __aws_sdk_dynamodbstreams_0_28,
783    mod_name = aws_sdk_dynamodbstreams_0_28,
784    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_28::types::AttributeValue,
785    blob_path = ::__aws_sdk_dynamodbstreams_0_28::primitives::Blob,
786    aws_version = "0.28",
787);
788
789aws_sdk_streams_macro!(
790    feature = "aws-sdk-dynamodbstreams+0_29",
791    crate_name = __aws_sdk_dynamodbstreams_0_29,
792    mod_name = aws_sdk_dynamodbstreams_0_29,
793    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_29::types::AttributeValue,
794    blob_path = ::__aws_sdk_dynamodbstreams_0_29::primitives::Blob,
795    aws_version = "0.29",
796);
797
798aws_sdk_streams_macro!(
799    feature = "aws-sdk-dynamodbstreams+0_30",
800    crate_name = __aws_sdk_dynamodbstreams_0_30,
801    mod_name = aws_sdk_dynamodbstreams_0_30,
802    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_30::types::AttributeValue,
803    blob_path = ::__aws_sdk_dynamodbstreams_0_30::primitives::Blob,
804    aws_version = "0.30",
805);
806
807aws_sdk_streams_macro!(
808    feature = "aws-sdk-dynamodbstreams+0_31",
809    crate_name = __aws_sdk_dynamodbstreams_0_31,
810    mod_name = aws_sdk_dynamodbstreams_0_31,
811    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_31::types::AttributeValue,
812    blob_path = ::__aws_sdk_dynamodbstreams_0_31::primitives::Blob,
813    aws_version = "0.31",
814);
815
816aws_sdk_streams_macro!(
817    feature = "aws-sdk-dynamodbstreams+0_32",
818    crate_name = __aws_sdk_dynamodbstreams_0_32,
819    mod_name = aws_sdk_dynamodbstreams_0_32,
820    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_32::types::AttributeValue,
821    blob_path = ::__aws_sdk_dynamodbstreams_0_32::primitives::Blob,
822    aws_version = "0.32",
823);
824
825aws_sdk_streams_macro!(
826    feature = "aws-sdk-dynamodbstreams+0_33",
827    crate_name = __aws_sdk_dynamodbstreams_0_33,
828    mod_name = aws_sdk_dynamodbstreams_0_33,
829    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_33::types::AttributeValue,
830    blob_path = ::__aws_sdk_dynamodbstreams_0_33::primitives::Blob,
831    aws_version = "0.33",
832);
833
834aws_sdk_streams_macro!(
835    feature = "aws-sdk-dynamodbstreams+0_34",
836    crate_name = __aws_sdk_dynamodbstreams_0_34,
837    mod_name = aws_sdk_dynamodbstreams_0_34,
838    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_34::types::AttributeValue,
839    blob_path = ::__aws_sdk_dynamodbstreams_0_34::primitives::Blob,
840    aws_version = "0.34",
841);
842
843aws_sdk_streams_macro!(
844    feature = "aws-sdk-dynamodbstreams+0_35",
845    crate_name = __aws_sdk_dynamodbstreams_0_35,
846    mod_name = aws_sdk_dynamodbstreams_0_35,
847    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_35::types::AttributeValue,
848    blob_path = ::__aws_sdk_dynamodbstreams_0_35::primitives::Blob,
849    aws_version = "0.35",
850);
851
852aws_sdk_streams_macro!(
853    feature = "aws-sdk-dynamodbstreams+0_36",
854    crate_name = __aws_sdk_dynamodbstreams_0_36,
855    mod_name = aws_sdk_dynamodbstreams_0_36,
856    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_36::types::AttributeValue,
857    blob_path = ::__aws_sdk_dynamodbstreams_0_36::primitives::Blob,
858    aws_version = "0.36",
859);
860
861aws_sdk_streams_macro!(
862    feature = "aws-sdk-dynamodbstreams+0_37",
863    crate_name = __aws_sdk_dynamodbstreams_0_37,
864    mod_name = aws_sdk_dynamodbstreams_0_37,
865    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_37::types::AttributeValue,
866    blob_path = ::__aws_sdk_dynamodbstreams_0_37::primitives::Blob,
867    aws_version = "0.37",
868);
869
870aws_sdk_streams_macro!(
871    feature = "aws-sdk-dynamodbstreams+0_38",
872    crate_name = __aws_sdk_dynamodbstreams_0_38,
873    mod_name = aws_sdk_dynamodbstreams_0_38,
874    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_38::types::AttributeValue,
875    blob_path = ::__aws_sdk_dynamodbstreams_0_38::primitives::Blob,
876    aws_version = "0.38",
877);
878
879aws_sdk_streams_macro!(
880    feature = "aws-sdk-dynamodbstreams+0_39",
881    crate_name = __aws_sdk_dynamodbstreams_0_39,
882    mod_name = aws_sdk_dynamodbstreams_0_39,
883    attribute_value_path = ::__aws_sdk_dynamodbstreams_0_39::types::AttributeValue,
884    blob_path = ::__aws_sdk_dynamodbstreams_0_39::primitives::Blob,
885    aws_version = "0.39",
886);
887
888aws_sdk_streams_macro!(
889    feature = "aws-sdk-dynamodbstreams+1",
890    crate_name = __aws_sdk_dynamodbstreams_1,
891    mod_name = aws_sdk_dynamodbstreams_1,
892    attribute_value_path = ::__aws_sdk_dynamodbstreams_1::types::AttributeValue,
893    blob_path = ::__aws_sdk_dynamodbstreams_1::primitives::Blob,
894    aws_version = "1",
895);
896
897rusoto_macro!(
898    feature = "rusoto_dynamodb+0_46",
899    crate_name = __rusoto_dynamodb_0_46,
900    mod_name = rusoto_dynamodb_0_46,
901    rusoto_version = "0.46",
902);
903
904rusoto_macro!(
905    feature = "rusoto_dynamodb+0_47",
906    crate_name = __rusoto_dynamodb_0_47,
907    mod_name = rusoto_dynamodb_0_47,
908    rusoto_version = "0.47",
909);
910
911rusoto_macro!(
912    feature = "rusoto_dynamodb+0_48",
913    crate_name = __rusoto_dynamodb_0_48,
914    mod_name = rusoto_dynamodb_0_48,
915    rusoto_version = "0.48",
916);
917
918rusoto_streams_macro!(
919    feature = "rusoto_dynamodbstreams+0_46",
920    crate_name = __rusoto_dynamodbstreams_0_46,
921    mod_name = rusoto_dynamodbstreams_0_46,
922    rusoto_version = "0.46",
923);
924
925rusoto_streams_macro!(
926    feature = "rusoto_dynamodbstreams+0_47",
927    crate_name = __rusoto_dynamodbstreams_0_47,
928    mod_name = rusoto_dynamodbstreams_0_47,
929    rusoto_version = "0.47",
930);
931
932rusoto_streams_macro!(
933    feature = "rusoto_dynamodbstreams+0_48",
934    crate_name = __rusoto_dynamodbstreams_0_48,
935    mod_name = rusoto_dynamodbstreams_0_48,
936    rusoto_version = "0.48",
937);
938
939aws_lambda_events_macro!(
940    feature = "aws_lambda_events+0_6",
941    crate_name = __aws_lambda_events_0_6,
942    mod_name = aws_lambda_events_0_6,
943    aws_lambda_events_version = "0.6",
944);
945
946aws_lambda_events_macro!(
947    feature = "aws_lambda_events+0_7",
948    crate_name = __aws_lambda_events_0_7,
949    mod_name = aws_lambda_events_0_7,
950    aws_lambda_events_version = "0.7",
951);
952
953#[cfg(test)]
954mod tests;