firebase_rs_sdk/firestore/model/
database_id.rs

1use 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}