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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions