{"record":{"id":"c13cc731b7a4f2ab","repo":"windmill-labs/windmill","slug":"unknown-service-currently-supported-services-are","errorCode":null,"errorMessage":"Unknown service, currently supported services are: [{}]","messagePattern":"Unknown service, currently supported services are: \\[(.+?)\\]","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/windmill-native-triggers/src/lib.rs","lineNumber":95,"sourceCode":"/// When adding a new service, add a variant here (e.g., `NewService`).\n#[derive(EnumIter, sqlx::Type, Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)]\n#[sqlx(type_name = \"native_trigger_service\", rename_all = \"lowercase\")]\n#[serde(rename_all = \"lowercase\")]\npub enum ServiceName {\n    Nextcloud,\n    Google,\n    Github,\n}\n\nimpl TryFrom<String> for ServiceName {\n    type Error = Error;\n    fn try_from(value: String) -> std::result::Result<Self, Self::Error> {\n        let service = match value.as_str() {\n            \"nextcloud\" => ServiceName::Nextcloud,\n            \"google\" => ServiceName::Google,\n            \"github\" => ServiceName::Github,\n            _ => {\n                return Err(anyhow::anyhow!(\n                    \"Unknown service, currently supported services are: [{}]\",\n                    ServiceName::iter().join(\",\")\n                )\n                .into())\n            }\n        };\n\n        Ok(service)\n    }\n}\n\nimpl ServiceName {\n    /// Returns the lowercase string identifier for this service.\n    pub fn as_str(&self) -> &'static str {\n        match self {\n            ServiceName::Nextcloud => \"nextcloud\",\n            ServiceName::Google => \"google\",\n            ServiceName::Github => \"github\",","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-native-triggers/src/lib.rs#L77-L113","documentation":"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().","triggerScenarios":"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.","commonSituations":"Typos in trigger configuration; older configs referencing a service that was renamed; assuming more services exist than are compiled in.","solutions":["Use one of the listed supported service strings exactly (lowercase): nextcloud, google, github","Check ServiceName::iter() output in the error message for the current supported list","Upgrade the version if a newly supported service is missing from your build"],"exampleFix":"// before\nservice = \"Github\"  // case mismatch\n// after\nservice = \"github\"","handlingStrategy":"validation","validationCode":"const SUPPORTED = ['nextcloud', 'google', 'github'];\nif (!SUPPORTED.includes(service)) throw new Error(`Unknown service \"${service}\"; supported: ${SUPPORTED.join(', ')}`);","typeGuard":"const isServiceName = (s) => ['nextcloud','google','github'].includes(s);","tryCatchPattern":"match ServiceName::try_from(value) {\n    Ok(s) => {},\n    Err(e) => eprintln!(\"{} — use one of: nextcloud, google, github\", e),\n}","preventionTips":["Use exact lowercase service strings from the error's supported list","Normalize/trim user input before conversion","Keep a frontend dropdown fed by the same source of truth instead of free text"],"tags":["config","validation","native-triggers"],"backgroundTag":"invalid-enum-value","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}