Route open providers by request mode
This commit is contained in:
@@ -152,6 +152,7 @@ type OpenProviderSupport struct {
|
||||
Mime []string `json:"mime,omitempty"`
|
||||
Extensions []string `json:"extensions,omitempty"`
|
||||
Contexts []string `json:"contexts,omitempty"`
|
||||
Modes []string `json:"modes,omitempty"`
|
||||
}
|
||||
|
||||
// ContributionOpenProvider represents an editor/viewer provider contribution.
|
||||
|
||||
@@ -168,6 +168,9 @@ func providerMatches(request OpenResourceRequest, provider plugin.ContributionOp
|
||||
if support.Kind != request.Kind {
|
||||
continue
|
||||
}
|
||||
if !supportMatchesMode(request, support) {
|
||||
continue
|
||||
}
|
||||
if !supportMatchesExtensionOrMime(request, support) {
|
||||
continue
|
||||
}
|
||||
@@ -179,6 +182,19 @@ func providerMatches(request OpenResourceRequest, provider plugin.ContributionOp
|
||||
return false
|
||||
}
|
||||
|
||||
func supportMatchesMode(request OpenResourceRequest, support plugin.OpenProviderSupport) bool {
|
||||
if len(support.Modes) == 0 {
|
||||
return true
|
||||
}
|
||||
mode := strings.ToLower(request.Mode)
|
||||
for _, supported := range support.Modes {
|
||||
if strings.ToLower(supported) == mode {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func supportMatchesExtensionOrMime(request OpenResourceRequest, support plugin.OpenProviderSupport) bool {
|
||||
hasExtensionRules := len(support.Extensions) > 0
|
||||
hasMimeRules := len(support.Mime) > 0
|
||||
|
||||
@@ -91,6 +91,47 @@ func TestSelectProviderFallsBackByPriorityThenID(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSelectProviderHonorsSupportModes(t *testing.T) {
|
||||
r := NewRouter(Preferences{})
|
||||
providers := []contribution.ContributionOpenProvider{
|
||||
provider("preview.plugin", "markdown.preview", 100, "MarkdownPreview", plugin.OpenProviderSupport{
|
||||
Kind: "vault-file",
|
||||
Extensions: []string{".md"},
|
||||
Contexts: []string{ContextGenericMarkdown},
|
||||
Modes: []string{"view"},
|
||||
}),
|
||||
provider("editor.plugin", "markdown.editor", 50, "MarkdownEditor", plugin.OpenProviderSupport{
|
||||
Kind: "vault-file",
|
||||
Extensions: []string{".md"},
|
||||
Contexts: []string{ContextGenericMarkdown},
|
||||
}),
|
||||
}
|
||||
|
||||
viewProvider, err := r.SelectProvider(OpenResourceRequest{
|
||||
Kind: "vault-file",
|
||||
Path: "Docs/readme.md",
|
||||
Mode: "view",
|
||||
}, providers)
|
||||
if err != nil {
|
||||
t.Fatalf("SelectProvider(view): %v", err)
|
||||
}
|
||||
if viewProvider.Item.ID != "markdown.preview" {
|
||||
t.Fatalf("view provider = %q, want markdown.preview", viewProvider.Item.ID)
|
||||
}
|
||||
|
||||
editProvider, err := r.SelectProvider(OpenResourceRequest{
|
||||
Kind: "vault-file",
|
||||
Path: "Docs/readme.md",
|
||||
Mode: "edit",
|
||||
}, providers)
|
||||
if err != nil {
|
||||
t.Fatalf("SelectProvider(edit): %v", err)
|
||||
}
|
||||
if editProvider.Item.ID != "markdown.editor" {
|
||||
t.Fatalf("edit provider = %q, want markdown.editor", editProvider.Item.ID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSelectProviderTieBreaksByPluginIDThenProviderID(t *testing.T) {
|
||||
r := NewRouter(Preferences{})
|
||||
providers := []contribution.ContributionOpenProvider{
|
||||
|
||||
Reference in New Issue
Block a user