add a discrete clone method to scopes (#1626)
## Description Adds a method to all scopes that produces a discrete clone of the original scope. The result is a shallow clone of the scope, thus retaining all original values, but is made discrete by replacing the resource owner target with a specific value. ## Type of change - [x] 🌻 Feature ## Issue(s) * #1621 ## Test Plan - [x] ⚡ Unit test
This commit is contained in:
parent
1d977105c0
commit
eb67db2fa5
@ -686,6 +686,12 @@ func (s ExchangeScope) setDefaults() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DiscreteCopy makes a shallow clone of the scope, then replaces the clone's
|
||||||
|
// user comparison with only the provided user.
|
||||||
|
func (s ExchangeScope) DiscreteCopy(user string) ExchangeScope {
|
||||||
|
return discreteCopy(s, user)
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Backup Details Filtering
|
// Backup Details Filtering
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@ -459,6 +459,29 @@ func (s OneDriveScope) setDefaults() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DiscreteCopy makes a clone of the scope, then replaces the clone's user comparison
|
||||||
|
// with only the provided user.
|
||||||
|
func (s OneDriveScope) DiscreteCopy(user string) OneDriveScope {
|
||||||
|
return discreteCopy(s, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Backup Details Filtering
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Reduce filters the entries in a details struct to only those that match the
|
||||||
|
// inclusions, filters, and exclusions in the selector.
|
||||||
|
func (s oneDrive) Reduce(ctx context.Context, deets *details.Details) *details.Details {
|
||||||
|
return reduce[OneDriveScope](
|
||||||
|
ctx,
|
||||||
|
deets,
|
||||||
|
s.Selector,
|
||||||
|
map[path.CategoryType]oneDriveCategory{
|
||||||
|
path.FilesCategory: OneDriveItem,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// matchesInfo handles the standard behavior when comparing a scope and an oneDriveInfo
|
// matchesInfo handles the standard behavior when comparing a scope and an oneDriveInfo
|
||||||
// returns true if the scope and info match for the provided category.
|
// returns true if the scope and info match for the provided category.
|
||||||
func (s OneDriveScope) matchesInfo(dii details.ItemInfo) bool {
|
func (s OneDriveScope) matchesInfo(dii details.ItemInfo) bool {
|
||||||
@ -480,20 +503,3 @@ func (s OneDriveScope) matchesInfo(dii details.ItemInfo) bool {
|
|||||||
|
|
||||||
return s.Matches(filterCat, i)
|
return s.Matches(filterCat, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Backup Details Filtering
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Reduce filters the entries in a details struct to only those that match the
|
|
||||||
// inclusions, filters, and exclusions in the selector.
|
|
||||||
func (s oneDrive) Reduce(ctx context.Context, deets *details.Details) *details.Details {
|
|
||||||
return reduce[OneDriveScope](
|
|
||||||
ctx,
|
|
||||||
deets,
|
|
||||||
s.Selector,
|
|
||||||
map[path.CategoryType]oneDriveCategory{
|
|
||||||
path.FilesCategory: OneDriveItem,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@ -243,6 +243,21 @@ func set[T scopeT](s T, cat categorizer, v []string, opts ...option) T {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// discreteCopy makes a shallow clone of the scocpe, and sets the resource
|
||||||
|
// owner filter target in the clone to the provided string.
|
||||||
|
func discreteCopy[T scopeT](s T, resourceOwner string) T {
|
||||||
|
clone := T{}
|
||||||
|
|
||||||
|
for k, v := range s {
|
||||||
|
clone[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return set(
|
||||||
|
clone,
|
||||||
|
clone.categorizer().rootCat(),
|
||||||
|
[]string{resourceOwner})
|
||||||
|
}
|
||||||
|
|
||||||
// returns true if the category is included in the scope's category type,
|
// returns true if the category is included in the scope's category type,
|
||||||
// and the value is set to None().
|
// and the value is set to None().
|
||||||
func isNoneTarget[T scopeT, C categoryT](s T, cat C) bool {
|
func isNoneTarget[T scopeT, C categoryT](s T, cat C) bool {
|
||||||
|
|||||||
@ -513,3 +513,20 @@ func (suite *SelectorScopesSuite) TestScopeConfig() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *SelectorScopesSuite) TestDiscreteCopy() {
|
||||||
|
var (
|
||||||
|
t = suite.T()
|
||||||
|
orig = stubScope(AnyTgt)
|
||||||
|
clone = discreteCopy(orig, "fnords")
|
||||||
|
)
|
||||||
|
|
||||||
|
for k, v := range orig {
|
||||||
|
if k != rootCatStub.String() {
|
||||||
|
assert.Equal(t, v.Target, clone[k].Target)
|
||||||
|
} else {
|
||||||
|
assert.Equal(t, AnyTgt, v.Target)
|
||||||
|
assert.Equal(t, "fnords", clone[k].Target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -407,6 +407,30 @@ func (s SharePointScope) setDefaults() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DiscreteCopy makes a shallow clone of the scope, then replaces the clone's
|
||||||
|
// site comparison with only the provided site.
|
||||||
|
func (s SharePointScope) DiscreteCopy(site string) SharePointScope {
|
||||||
|
return discreteCopy(s, site)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Backup Details Filtering
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Reduce filters the entries in a details struct to only those that match the
|
||||||
|
// inclusions, filters, and exclusions in the selector.
|
||||||
|
func (s sharePoint) Reduce(ctx context.Context, deets *details.Details) *details.Details {
|
||||||
|
return reduce[SharePointScope](
|
||||||
|
ctx,
|
||||||
|
deets,
|
||||||
|
s.Selector,
|
||||||
|
map[path.CategoryType]sharePointCategory{
|
||||||
|
path.LibrariesCategory: SharePointLibraryItem,
|
||||||
|
// TODO: list category type
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// matchesInfo handles the standard behavior when comparing a scope and an sharePointInfo
|
// matchesInfo handles the standard behavior when comparing a scope and an sharePointInfo
|
||||||
// returns true if the scope and info match for the provided category.
|
// returns true if the scope and info match for the provided category.
|
||||||
func (s SharePointScope) matchesInfo(dii details.ItemInfo) bool {
|
func (s SharePointScope) matchesInfo(dii details.ItemInfo) bool {
|
||||||
@ -428,21 +452,3 @@ func (s SharePointScope) matchesInfo(dii details.ItemInfo) bool {
|
|||||||
|
|
||||||
return s.Matches(filterCat, i)
|
return s.Matches(filterCat, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Backup Details Filtering
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Reduce filters the entries in a details struct to only those that match the
|
|
||||||
// inclusions, filters, and exclusions in the selector.
|
|
||||||
func (s sharePoint) Reduce(ctx context.Context, deets *details.Details) *details.Details {
|
|
||||||
return reduce[SharePointScope](
|
|
||||||
ctx,
|
|
||||||
deets,
|
|
||||||
s.Selector,
|
|
||||||
map[path.CategoryType]sharePointCategory{
|
|
||||||
path.LibrariesCategory: SharePointLibraryItem,
|
|
||||||
// TODO: list category type
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user