Route open providers by request mode

This commit is contained in:
2026-06-27 13:49:09 +08:00
parent f87f8235bd
commit fb68c54409
8 changed files with 71 additions and 6 deletions
+1
View File
@@ -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.
+16
View File
@@ -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
+41
View File
@@ -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{