Skip to content

idea: move logic from fn metadata(&self) -> Arc<AccessorInfo> to impl<A: Access> Layer<A> for CompleteLayer #4888

@Lzzzzzt

Description

@Lzzzzzt

Feature Description

Since the CompleteAccessor stores the metadata, and Access::info return the Arc<AccessorInfo>, we can move logic from fn metadata(&self) -> Arc<AccessorInfo> to impl<A: Access> Layer<A> for CompleteLayer to avoid creating a new Arc<AccessorInfo>(this is not add the reference count).

Problem and Solution

just change CompleteAccessor::metadata:

fn metadata(&self) -> Arc<AccessorInfo> {
    let mut meta = (*self.meta).clone();
    let cap = meta.full_capability_mut();
    if cap.list && cap.write_can_empty {
        cap.create_dir = true;
    }
    meta.into()
}

to

fn metadata(&self) -> Arc<AccessorInfo> {
   self.meta.clone()
}

and change CompleteLayer::layer:

fn layer(&self, inner: A) -> Self::LayeredAccess {
    CompleteAccessor {
        meta: inner.info(),
        inner: Arc::new(inner),
    }
}

to

fn layer(&self, inner: A) -> Self::LayeredAccess {
    let mut meta = inner.info().as_ref().clone();
    let cap = meta.full_capability_mut();

    if cap.list && cap.write_can_empty {
        cap.create_dir = true;
    }

    CompleteAccessor {
        meta: meta.into(),
        inner: Arc::new(inner),
    }
}

Additional Context

All the layers that store the metadata can apply this change.

Are you willing to contribute to the development of this feature?

  • Yes, I am willing to contribute to the development of this feature.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions