cranpose-services 0.22.3

Multiplatform service contracts and platform integrations for Cranpose apps
Documentation
use std::{
    path::{Path, PathBuf},
    sync::OnceLock,
};

use crate::content::ContentError;

pub(super) struct FolderReference {
    root: PathBuf,
    retained: OnceLock<Result<String, ContentError>>,
}

impl FolderReference {
    pub(super) fn new(root: PathBuf) -> Self {
        Self {
            root,
            retained: OnceLock::new(),
        }
    }

    pub(super) fn reference(&self, path: &Path) -> Result<String, ContentError> {
        let relative = path
            .strip_prefix(&self.root)
            .map_err(|_| ContentError::Io("media path is outside the selected folder".into()))?;
        let retained = self
            .retained
            .get_or_init(|| {
                crate::media_source::media_reference(&self.root)
                    .map_err(|error| super::io_error(&self.root, error))
            })
            .as_ref()
            .map_err(Clone::clone)?;
        crate::media_source::media_child_reference(retained, relative)
            .map_err(|error| super::io_error(path, error))
    }
}