firebase_rs_sdk/firestore/model/
database_id.rs1use crate::app::FirebaseApp;
2use crate::firestore::constants::DEFAULT_DATABASE_ID;
3use crate::firestore::error::{missing_project_id, FirestoreResult};
4
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6pub struct DatabaseId {
7 project_id: String,
8 database: String,
9}
10
11impl DatabaseId {
12 pub fn new(project_id: impl Into<String>, database: impl Into<String>) -> Self {
13 Self {
14 project_id: project_id.into(),
15 database: database.into(),
16 }
17 }
18
19 pub fn default(project_id: impl Into<String>) -> Self {
20 Self::new(project_id, DEFAULT_DATABASE_ID)
21 }
22
23 pub fn from_app(app: &FirebaseApp) -> FirestoreResult<Self> {
24 let options = app.options();
25 let project_id = options.project_id.clone().ok_or_else(missing_project_id)?;
26 Ok(Self::default(project_id))
27 }
28
29 pub fn project_id(&self) -> &str {
30 &self.project_id
31 }
32
33 pub fn database(&self) -> &str {
34 &self.database
35 }
36
37 pub fn with_database(&self, database: impl Into<String>) -> Self {
38 Self::new(self.project_id.clone(), database)
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45 use crate::app::api::initialize_app;
46 use crate::app::FirebaseAppSettings;
47 use crate::app::FirebaseOptions;
48
49 fn unique_settings() -> FirebaseAppSettings {
50 use std::sync::atomic::{AtomicUsize, Ordering};
51 static COUNTER: AtomicUsize = AtomicUsize::new(0);
52 FirebaseAppSettings {
53 name: Some(format!(
54 "firestore-db-{}",
55 COUNTER.fetch_add(1, Ordering::SeqCst)
56 )),
57 ..Default::default()
58 }
59 }
60
61 #[test]
62 fn builds_from_app() {
63 let options = FirebaseOptions {
64 project_id: Some("project".into()),
65 ..Default::default()
66 };
67 let app = initialize_app(options, Some(unique_settings())).unwrap();
68 let db = DatabaseId::from_app(&app).unwrap();
69 assert_eq!(db.project_id(), "project");
70 assert_eq!(db.database(), DEFAULT_DATABASE_ID);
71 }
72
73 #[test]
74 fn missing_project_id_errors() {
75 let options = FirebaseOptions {
76 api_key: Some("test".into()),
77 ..Default::default()
78 };
79 let app = initialize_app(options, Some(unique_settings())).unwrap();
80 let err = DatabaseId::from_app(&app).unwrap_err();
81 assert_eq!(err.code_str(), "firestore/missing-project-id");
82 }
83}