//! Path layout for a `.gdd` working copy. //! //! Layout owns basenames only — the codec choice for each payload is a runtime parameter at the //! read/write call site. Working-copy creation, exports, and migrations may all hit the same //! basename with different codecs. use graphene_resource::ResourceHash; pub trait Layout { fn manifest_basename(&self) -> &str; fn session_basename(&self) -> &str; fn registry_basename(&self) -> &str; fn history_basename(&self) -> &str; fn hot_log_basename(&self) -> &str; fn resources_dir(&self) -> &str; fn resource_path(&self, hash: &ResourceHash) -> String; /// The embedded legacy `.graphite` document, stored verbatim during the dual-write soak so the /// new format can be validated against (and recovered from) the old one. Dropped once `.gdd` /// becomes the sole source of truth. fn legacy_path(&self) -> &str; } #[derive(Copy, Clone, Debug, Default)] pub struct GddV1Layout; impl Layout for GddV1Layout { fn manifest_basename(&self) -> &str { "manifest" } fn session_basename(&self) -> &str { "session" } fn registry_basename(&self) -> &str { "registry" } fn history_basename(&self) -> &str { "history" } fn hot_log_basename(&self) -> &str { "hot-log" } fn resources_dir(&self) -> &str { "resources" } fn resource_path(&self, hash: &ResourceHash) -> String { format!("{}/{hash}", self.resources_dir()) } fn legacy_path(&self) -> &str { "legacy.graphite" } }