Tencent/WeKnora · error
ErrInvalidConfig
ErrInvalidConfig
Error message
%w: config is nil
What it means
parseYuqueConfig validates the Yuque connector's DataSourceConfig before use. It wraps datasource.ErrInvalidConfig when the config pointer itself is nil, meaning the connector was invoked without any configuration object at all. This is a fail-fast guard: no credentials parsing is attempted without a config.
Source
Thrown at internal/datasource/connector/yuque/types.go:67
func (c *Config) GetBaseURL() string {
url := strings.TrimSpace(c.BaseURL)
if url == "" {
return DefaultBaseURL
}
if !strings.Contains(url, "://") {
url = "https://" + url
}
url = strings.TrimRight(url, "/")
return url
}
// parseYuqueConfig extracts and validates Yuque-specific configuration.
// Uses JSON marshal/unmarshal roundtrip (consistent with Feishu's parseFeishuConfig)
// rather than single-field type assertion, because we have multiple fields with
// optional defaults.
func parseYuqueConfig(config *types.DataSourceConfig) (*Config, error) {
if config == nil {
return nil, fmt.Errorf("%w: config is nil", datasource.ErrInvalidConfig)
}
credBytes, err := json.Marshal(config.Credentials)
if err != nil {
return nil, fmt.Errorf("marshal credentials: %w", err)
}
var cfg Config
if err := json.Unmarshal(credBytes, &cfg); err != nil {
return nil, fmt.Errorf("parse yuque credentials: %w", err)
}
if strings.TrimSpace(cfg.APIToken) == "" {
return nil, fmt.Errorf("%w: api_token is required", datasource.ErrInvalidCredentials)
}
if err := datasource.ValidateConnectorBaseURL(cfg.GetBaseURL()); err != nil {
return nil, err
}
return &cfg, nil
}
View on GitHub (pinned to 988cbb0330)
Solutions
- Ensure the DataSourceConfig is loaded/constructed before calling the connector (check registry/store lookup result for nil).
- Validate config presence at the call site with a nil check before invoking Validate/ListResources/walk.
- Fix upstream config loading so partially-configured datasources are skipped or reported instead of passed through.
Example fix
// before
conn.ListResources(ctx, nil)
// after
if cfg == nil {
return fmt.Errorf("yuque datasource not configured")
}
conn.ListResources(ctx, cfg) Defensive patterns
Strategy: validation
Validate before calling
if config == nil {
return fmt.Errorf("yuque datasource requires a DataSourceConfig")
} Type guard
func hasConfig(c *types.DataSourceConfig) bool { return c != nil } Try / catch
cfg, err := parseYuqueConfig(config)
if err != nil {
if errors.Is(err, datasource.ErrInvalidConfig) {
// surface a clear "datasource not configured" message
}
return err
} Prevention
- Never invoke connector Validate/ListResources/walk with a nil config; check registry lookup results.
- Skip or flag unconfigured datasources at load time.
- Add unit tests covering the nil-config path.
When it happens
Trigger: Calling Validate, ListResources, or walk on the Yuque connector with a nil *types.DataSourceConfig, or an anonymous caller path passing nil config.
Common situations: A datasource entry failed to load from config storage but the connector was still invoked; a factory/registry returns the connector but skips config construction; tests or callers construct the adapter without wiring a config.
Related errors
- yuque connection failed: %w
- invalid book id %q: %w
- no resource IDs (book IDs) configured
- sandbox: config is missing required fields
- sandbox: docker backend is disabled; enable it in System Set
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/a01fe8355c7f4a55.
Report an issue: GitHub.