Files
sub-store/internal/render/dispatch.go
T
rogee 9ec8c956c1 feat: sing-box Clash template support + Docker CI + frontend scaffold
- Clash→sing-box template conversion engine (singbox_template.go)
- Auto-map 40+ Clash rule-providers to sing-box .srs binary rule-sets
- Fix sing-box 1.11+/1.12+ migrations (sniff/block/WireGuard/DNS/rule_set)
- Fix WireGuard URI '+' parsing bug (rawParamGet)
- Add REJECT block outbound for selector group references
- Skip rules referencing rule-sets with no sing-box equivalent
- Verified: sing-box run succeeds with ACL4SSR template (16 rule-sets loaded)
- Add Dockerfile (multi-stage Go build)
- Add GitHub Actions workflow (multi-arch: amd64+arm64, push to ghcr.io)
- Add frontend scaffold (Vue3 + Vite + Tailwind)
2026-07-27 21:56:19 +08:00

85 lines
2.8 KiB
Go

package render
import (
"fmt"
"net/url"
"strings"
"github.com/peterqiu0516/sub-store/internal/model"
"github.com/peterqiu0516/sub-store/internal/util"
)
// RenderTarget dispatches to the appropriate renderer based on target.
// This is the simplified entry point matching renderTarget() in the reference.
func RenderTarget(proxies []model.ProxyNode, target string, template map[string]any) (string, error) {
if len(proxies) == 0 {
return "", fmt.Errorf("No supported nodes for %s output", target)
}
switch target {
case model.TargetMihomo, model.TargetStash:
return RenderMihomoYaml(proxies, "https://sub-store.local/convert", template), nil
case model.TargetSurge:
return RenderSurgeProxies(proxies)
case model.TargetSurgeMac:
return RenderSurgeMacProxies(proxies)
case model.TargetSurfboard:
return RenderSurfboardProxies(proxies)
case model.TargetLoon:
return RenderLoonProxies(proxies)
case model.TargetEgern:
return RenderEgernYaml(proxies)
case model.TargetQX:
return RenderQxProxies(proxies)
case model.TargetSingBox:
return RenderSingBoxWithTemplate(proxies, template), nil
case model.TargetV2ray:
return util.Base64Utf8(RenderProxyUris(proxies)), nil
case model.TargetURI, model.TargetShadowrocket:
return RenderProxyUris(proxies), nil
case model.TargetJSON:
return RenderJson(proxies), nil
default:
return RenderMihomoYaml(proxies, "https://sub-store.local/convert", template), nil
}
}
// RenderBuildTarget dispatches with a request URL for mihomo source comments.
func RenderBuildTarget(proxies []model.ProxyNode, target string, requestUrl string, template map[string]any) (string, error) {
switch target {
case model.TargetMihomo, model.TargetStash:
return RenderMihomoYaml(proxies, requestUrl, template), nil
case model.TargetSurge:
return RenderSurgeProxies(proxies)
case model.TargetSurgeMac:
return RenderSurgeMacProxies(proxies)
case model.TargetSurfboard:
return RenderSurfboardProxies(proxies)
case model.TargetLoon:
return RenderLoonProxies(proxies)
case model.TargetEgern:
return RenderEgernYaml(proxies)
case model.TargetShadowrocket:
return RenderProxyUris(proxies), nil
case model.TargetQX:
return RenderQxProxies(proxies)
case model.TargetSingBox:
return RenderSingBoxWithTemplate(proxies, template), nil
case model.TargetV2ray:
return util.Base64Utf8(RenderProxyUris(proxies)), nil
case model.TargetURI:
return RenderProxyUris(proxies), nil
case model.TargetJSON:
return RenderJson(proxies), nil
default:
return RenderMihomoYaml(proxies, requestUrl, template), nil
}
}
// sourcePath extracts the path portion of requestUrl for the YAML header comment.
func sourcePath(requestUrl string) string {
if u, err := url.Parse(requestUrl); err == nil && u.Path != "" {
return u.Path
}
return strings.TrimPrefix(requestUrl, "https://")
}