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

  1. Ensure the DataSourceConfig is loaded/constructed before calling the connector (check registry/store lookup result for nil).
  2. Validate config presence at the call site with a nil check before invoking Validate/ListResources/walk.
  3. 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

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


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/a01fe8355c7f4a55. Report an issue: GitHub.