use dotenvy::dotenv;
use firebase_http_client::prelude::*;
use serde::{Deserialize, Serialize};
use std::env;
#[derive(Serialize, Deserialize, Debug)]
struct SomeDataForFirestore {
name: String,
age: u32,
inner: SomeInnerStruct,
}
#[derive(Serialize, Deserialize, Debug)]
struct SomeInnerStruct {
data: String,
data_2: f64,
}
fn main() {
dotenv().ok();
let api_key = env::var("FIREBASE_API_KEY").unwrap_or_else(|_| {
eprintln!("FIREBASE_API_KEY not set. Set .env variable FIREBASE_API_KEY");
std::process::exit(1);
});
let project_id = env::var("FIREBASE_PROJECT_ID").unwrap_or_else(|_| {
eprintln!("FIREBASE_PROJECT_ID not set. Set .env variable FIREBASE_PROJECT_ID.");
std::process::exit(1);
});
let client = Client::new(api_key);
let mut session = client.login().unwrap();
let firestore = Firestore::new(project_id);
let tests = firestore.collection("tests");
let doc_1 = tests.doc("test_doc");
doc_1
.set(
&mut session,
SomeDataForFirestore {
name: "John Doe".to_string(),
age: 30,
inner: SomeInnerStruct {
data: "Hello".to_string(),
data_2: 3.14,
},
},
)
.unwrap();
Batch::new(firestore)
.update(tests.doc("test_doc_2").with_data(SomeDataForFirestore {
name: "Jane Doe".to_string(),
age: 28,
inner: SomeInnerStruct {
data: "World".to_string(),
data_2: 2.718,
},
}))
.unwrap()
.update(tests.doc("test_doc_3").with_data(SomeDataForFirestore {
name: "Alice".to_string(),
age: 25,
inner: SomeInnerStruct {
data: "Foo".to_string(),
data_2: 1.618,
},
}))
.unwrap()
.delete(doc_1)
.write(&mut session)
.unwrap();
let list = tests.get::<SomeDataForFirestore>(&mut session).unwrap();
let added = tests
.add(
&mut session,
SomeDataForFirestore {
name: "Bob".to_string(),
age: 1,
inner: SomeInnerStruct {
data: "Bar".to_string(),
data_2: 1.414,
},
},
)
.unwrap();
added.reference().delete(&mut session).unwrap();
println!("{list:?}");
println!("{:?}", added);
}