// Code generated by ndpgen. DO NOT EDIT. // // This file contains client wrappers for the {{.Service.Name}} host service. // It is intended for use in Navidrome plugins built with extism-pdk. use extism_pdk::*; use serde::{Deserialize, Serialize}; {{- /* Generate struct definitions */ -}} {{- range .Service.Structs}} {{if .Doc}} {{rustDocComment .Doc}} {{else}} {{end}}#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct {{.Name}} { {{- range .Fields}} {{- if .NeedsDefault}} #[serde(default)] {{- end}} pub {{.RustName}}: {{fieldRustType .}}, {{- end}} } {{- end}} {{- /* Generate request/response types */ -}} {{- range .Service.Methods}} {{- if .HasParams}} #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] struct {{requestType .}} { {{- range .Params}} {{.RustName}}: {{rustType .}}, {{- end}} } {{- end}} #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] struct {{responseType .}} { {{- range .Returns}} #[serde(default)] {{.RustName}}: {{rustType .}}, {{- end}} {{- if .HasError}} #[serde(default)] error: Option, {{- end}} } {{- end}} #[host_fn] extern "ExtismHost" { {{- range .Service.Methods}} fn {{exportName .}}(input: Json<{{if .HasParams}}{{requestType .}}{{else}}serde_json::Value{{end}}>) -> Json<{{responseType .}}>; {{- end}} } {{- /* Generate wrapper functions */ -}} {{range .Service.Methods}} {{if .Doc}}{{rustDocComment .Doc}}{{else}}/// Calls the {{exportName .}} host function.{{end}} {{- if .HasParams}} /// /// # Arguments {{- range .Params}} /// * `{{.RustName}}` - {{rustType .}} parameter. {{- end}} {{- end}} {{- if .HasReturns}} /// /// # Returns {{- if .IsOptionPattern}} /// `Some({{(index .Returns 0).RustName}})` if found, `None` otherwise. {{- else if eq (len .Returns) 1}} /// The {{(index .Returns 0).RustName}} value. {{- else}} /// A tuple of ({{range $i, $r := .Returns}}{{if $i}}, {{end}}{{$r.RustName}}{{end}}). {{- end}} {{- end}} /// /// # Errors /// Returns an error if the host function call fails. {{- if .IsOptionPattern}} pub fn {{rustFunc .}}({{range $i, $p := .Params}}{{if $i}}, {{end}}{{$p.RustName}}: {{rustParamType $p}}{{end}}) -> Result, Error> { let response = unsafe { {{- if .HasParams}} {{exportName .}}(Json({{requestType .}} { {{- range .Params}} {{.RustName}}: {{.RustName}}{{if .NeedsToOwned}}.to_owned(){{end}}, {{- end}} }))? {{- else}} {{exportName .}}(Json(serde_json::json!({})))? {{- end}} }; {{if .HasError}} if let Some(err) = response.0.error { return Err(Error::msg(err)); } {{end}} if response.0.{{(index .Returns 1).RustName}} { Ok(Some(response.0.{{(index .Returns 0).RustName}})) } else { Ok(None) } } {{- else}} pub fn {{rustFunc .}}({{range $i, $p := .Params}}{{if $i}}, {{end}}{{$p.RustName}}: {{rustParamType $p}}{{end}}) -> Result<{{if eq (len .Returns) 0}}(){{else if eq (len .Returns) 1}}{{rustType (index .Returns 0)}}{{else}}({{range $i, $r := .Returns}}{{if $i}}, {{end}}{{rustType $r}}{{end}}){{end}}, Error> { let response = unsafe { {{- if .HasParams}} {{exportName .}}(Json({{requestType .}} { {{- range .Params}} {{.RustName}}: {{.RustName}}{{if .NeedsToOwned}}.to_owned(){{end}}, {{- end}} }))? {{- else}} {{exportName .}}(Json(serde_json::json!({})))? {{- end}} }; {{if .HasError}} if let Some(err) = response.0.error { return Err(Error::msg(err)); } {{end}} {{- if eq (len .Returns) 0}} Ok(()) {{- else if eq (len .Returns) 1}} Ok(response.0.{{(index .Returns 0).RustName}}) {{- else}} Ok(({{range $i, $r := .Returns}}{{if $i}}, {{end}}response.0.{{$r.RustName}}{{end}})) {{- end}} } {{- end}} {{- end}}