#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Status {
NotStarted,
InProgress,
Tested,
Documented,
}
#[derive(Debug, Clone)]
pub struct Component {
pub name: &'static str,
pub status: Status,
pub location: &'static str,
pub dependencies: &'static [&'static str],
pub notes: &'static str,
}
pub const IMPLEMENTED: &[Component] = &[
Component {
name: "FirebaseError",
status: Status::NotStarted,
location: "src/error.rs",
dependencies: &[],
notes: "Core error type with thiserror",
},
Component {
name: "AuthError",
status: Status::NotStarted,
location: "src/error.rs",
dependencies: &[],
notes: "Authentication-specific errors",
},
Component {
name: "FirestoreError",
status: Status::NotStarted,
location: "src/error.rs",
dependencies: &[],
notes: "Firestore-specific errors",
},
Component {
name: "User",
status: Status::NotStarted,
location: "src/auth/types.rs",
dependencies: &["UserMetadata", "UserInfo"],
notes: "C++: auth/src/include/firebase/auth/user.h:498",
},
Component {
name: "Credential",
status: Status::NotStarted,
location: "src/auth/types.rs",
dependencies: &[],
notes: "C++: auth/src/include/firebase/auth/credential.h",
},
Component {
name: "FieldValue",
status: Status::NotStarted,
location: "src/firestore/types.rs",
dependencies: &["GeoPoint", "Timestamp"],
notes: "C++: firestore/src/include/firebase/firestore/field_value.h",
},
];
impl Component {
pub fn is_ready(&self) -> bool {
matches!(self.status, Status::Tested | Status::Documented)
}
pub fn dependencies_ready(&self) -> bool {
self.dependencies.iter().all(|dep| {
IMPLEMENTED.iter()
.find(|c| c.name == *dep)
.map(|c| c.is_ready())
.unwrap_or(false)
})
}
}
pub fn get_component(name: &str) -> Option<&'static Component> {
IMPLEMENTED.iter().find(|c| c.name == name)
}
pub fn components_by_status(status: Status) -> Vec<&'static Component> {
IMPLEMENTED.iter()
.filter(|c| c.status == status)
.collect()
}
pub fn ready_to_implement() -> Vec<&'static Component> {
IMPLEMENTED.iter()
.filter(|c| {
c.status == Status::NotStarted && c.dependencies_ready()
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_component_lookup() {
let component = get_component("FirebaseError");
assert!(component.is_some());
}
#[test]
fn test_ready_to_implement() {
let ready = ready_to_implement();
assert!(!ready.is_empty());
}
}