windmill-labs/windmill · error

Unknown service, currently supported services are: [{}]

Error message

Unknown service, currently supported services are: [{}]

What it means

TryFrom<String> for ServiceName only accepts the known native-trigger service identifiers ('nextcloud', 'google', 'github'). Any other string fails conversion with this error listing all supported services via ServiceName::iter().

Source

Thrown at backend/windmill-native-triggers/src/lib.rs:95

/// When adding a new service, add a variant here (e.g., `NewService`).
#[derive(EnumIter, sqlx::Type, Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[sqlx(type_name = "native_trigger_service", rename_all = "lowercase")]
#[serde(rename_all = "lowercase")]
pub enum ServiceName {
    Nextcloud,
    Google,
    Github,
}

impl TryFrom<String> for ServiceName {
    type Error = Error;
    fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
        let service = match value.as_str() {
            "nextcloud" => ServiceName::Nextcloud,
            "google" => ServiceName::Google,
            "github" => ServiceName::Github,
            _ => {
                return Err(anyhow::anyhow!(
                    "Unknown service, currently supported services are: [{}]",
                    ServiceName::iter().join(",")
                )
                .into())
            }
        };

        Ok(service)
    }
}

impl ServiceName {
    /// Returns the lowercase string identifier for this service.
    pub fn as_str(&self) -> &'static str {
        match self {
            ServiceName::Nextcloud => "nextcloud",
            ServiceName::Google => "google",
            ServiceName::Github => "github",

View on GitHub (pinned to e474e8803c)

Solutions

  1. Use one of the listed supported service strings exactly (lowercase): nextcloud, google, github
  2. Check ServiceName::iter() output in the error message for the current supported list
  3. Upgrade the version if a newly supported service is missing from your build

Example fix

// before
service = "Github"  // case mismatch
// after
service = "github"
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED = ['nextcloud', 'google', 'github'];
if (!SUPPORTED.includes(service)) throw new Error(`Unknown service "${service}"; supported: ${SUPPORTED.join(', ')}`);

Type guard

const isServiceName = (s) => ['nextcloud','google','github'].includes(s);

Try / catch

match ServiceName::try_from(value) {
    Ok(s) => {},
    Err(e) => eprintln!("{} — use one of: nextcloud, google, github", e),
}

Prevention

When it happens

Trigger: Configuring a native trigger with a service name that is misspelled, differently cased (e.g. 'GitHub', 'Google-Sheets'), or not yet supported; webhook/trigger setup where the service field comes from user input.

Common situations: Typos in trigger configuration; older configs referencing a service that was renamed; assuming more services exist than are compiled in.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/c13cc731b7a4f2ab. Report an issue: GitHub.