Skip to content

Commit feba746

Browse files
committed
docs: Fix & test outdated examples
Closes #58
1 parent f632d11 commit feba746

File tree

5 files changed

+479
-36
lines changed

5 files changed

+479
-36
lines changed

README.md

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,32 @@ use indexed_db_futures::database::Database;
2222
use indexed_db_futures::prelude::*;
2323
use indexed_db_futures::transaction::TransactionMode;
2424

25-
#[derive(serde::Serialize, serde::Deserialize)]
25+
#[derive(Serialize, Deserialize)]
2626
struct MySerdeType(u8, String);
2727

28+
#[derive(Deserialize)]
29+
#[serde(untagged)]
30+
enum ObjectOrString {
31+
Object(MySerdeType),
32+
String(String),
33+
}
34+
2835
async fn main() -> indexed_db_futures::OpenDbResult<()> {
2936
let db = Database::open("my_db")
3037
.with_version(2u8)
3138
.with_on_upgrade_needed(|event, db| {
39+
// Convert versions from floats to integers to allow using them in match expressions
40+
let old_version = event.old_version() as u64;
41+
let new_version = event.new_version().map(|v| v as u64);
42+
3243
match (event.old_version(), event.new_version()) {
33-
(0.0, Some(1.0)) => {
44+
(0, Some(1)) => {
3445
db.create_object_store("my_store")
3546
.with_auto_increment(true)
3647
.build()?;
3748
}
38-
(prev, Some(2.0)) => {
39-
if prev == 1.0 {
49+
(prev, Some(2)) => {
50+
if prev == 1 {
4051
let _ = db.delete_object_store("my_store");
4152
}
4253

@@ -59,28 +70,47 @@ async fn main() -> indexed_db_futures::OpenDbResult<()> {
5970

6071
store
6172
.put("a primitive value that doesn't need serde")
73+
.with_key("my_key")
6274
.await?;
6375

64-
// awaiting individual requests is optional - they still go out
65-
store.put(MySerdeType(10, "foos".into())).serde()?;
76+
// Awaiting individual requests is optional - they still go out
77+
store
78+
.put(MySerdeType(10, "foos".into()))
79+
.with_key("my_serde_key")
80+
.with_key_type::<String>() // `serde` keys must be deserialisable; String is, but the &str above isn't
81+
.serde()?;
6682

6783
// Unlike JS, transactions ROLL BACK INSTEAD OF COMMITTING BY DEFAULT
6884
transaction.commit().await?;
6985

7086
// Read some data
7187
let transaction = db.transaction("my_other_store").build()?;
7288
let store = transaction.object_store("my_other_store")?;
73-
let Some(mut cursor) = store.open_cursor().await? else {
74-
// `None` is returned if the cursor is empty
75-
return Ok(());
76-
};
77-
78-
loop {
79-
match cursor.next_record_ser::<MySerdeType>().await {
80-
Ok(Some(record)) => handle_record(record),
81-
Ok(None) => break,
82-
Err(e) => handle_error(e),
89+
90+
// `None` is returned if the cursor is empty
91+
if let Some(mut cursor) = store.open_cursor().await? {
92+
// Use a limited loop in case we made a mistake and result in an infinite loop
93+
for _ in 0..5 {
94+
// We inserted a serde record and a primitive one so we need to deserialise as an enum that supports both
95+
match cursor.next_record_ser::<ObjectOrString>().await {
96+
Ok(Some(record)) => match record {
97+
ObjectOrString::Object(serde_record) => {
98+
assert_eq!(serde_record.0, 10);
99+
assert_eq!(serde_record.1, "foos");
100+
}
101+
ObjectOrString::String(string_record) => {
102+
assert_eq!(
103+
string_record.as_str(),
104+
"a primitive value that doesn't need serde"
105+
);
106+
}
107+
},
108+
Err(e) => return Err(e.into()),
109+
Ok(None) => return Ok(()), // reached cursor end
110+
}
83111
}
112+
113+
panic!("Got an infinite loop!");
84114
}
85115

86116
Ok(())

src/error/serde.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use cfg_if::cfg_if;
2+
use std::fmt;
23

34
use super::Error;
45
use super::SerialisationError;
@@ -15,28 +16,23 @@ cfg_if! {
1516
/// [`serde_wasm_bindgen::Error`](https://docs.rs/serde-wasm-bindgen/0.6.5/serde_wasm_bindgen/struct.Error.html).
1617
///
1718
/// Is an empty struct if the `serde` feature is not enabled.
18-
#[cfg_attr(feature = "serde", derive(derive_more::From))]
19+
#[derive(Debug)]
20+
#[cfg_attr(feature = "serde", derive(derive_more::From), repr(transparent))]
1921
#[cfg_attr(not(feature = "serde"), derive(StructName))]
2022
pub struct SerdeError(#[cfg(feature = "serde")] BaseError);
2123

22-
macro_rules! display_like {
23-
($for: ty > $($which: ident),+) => {
24-
$(impl std::fmt::$which for $for {
25-
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
26-
::cfg_if::cfg_if! {
27-
if #[cfg(feature = "serde")] {
28-
std::fmt::$which::fmt(&self.0, f)
29-
} else {
30-
f.write_str(&<Self as StructName>::TYPE_NAME)
31-
}
32-
}
24+
impl fmt::Display for SerdeError {
25+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26+
::cfg_if::cfg_if! {
27+
if #[cfg(feature = "serde")] {
28+
fmt::Display::fmt(&self.0, f)
29+
} else {
30+
f.write_str(<Self as StructName>::TYPE_NAME)
3331
}
34-
})+
35-
};
32+
}
33+
}
3634
}
3735

38-
display_like!(SerdeError > Debug, Display);
39-
4036
impl ::std::error::Error for SerdeError {
4137
#[inline]
4238
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {

src/lib.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,26 @@
9393
//! Ok(())
9494
//! })
9595
//! .with_on_upgrade_needed_fut(|event, db| async move {
96-
//! match (event.old_version(), event.new_version()) {
97-
//! (0.0, Some(1.0)) => {
96+
//! // Convert versions from floats to integers to allow using them in match expressions
97+
//! let old_version = event.old_version() as u64;
98+
//! let new_version = event.new_version().map(|v| v as u64);
99+
//!
100+
//! match (old_version, new_version) {
101+
//! (0, Some(1)) => {
98102
//! db.create_object_store("my_store")
99103
//! .with_auto_increment(true)
100104
//! .build()?;
101105
//! }
102-
//! (prev, Some(2.0)) => {
103-
//! if prev == 1.0 {
106+
//! (prev, Some(2)) => {
107+
//! if prev == 1 {
104108
//! if let Err(e) = db.delete_object_store("my_store") {
105109
//! log::error!("Error deleting v1 object store: {}", e);
106110
//! }
107111
//! }
108112
//!
109113
//! // Create an object store and await its transaction before inserting data.
110114
//! db.create_object_store("my_other_store")
115+
//! .with_auto_increment(true)
111116
//! .build()?
112117
//! .transaction()
113118
//! .on_done()?

0 commit comments

Comments
 (0)