🏡 index : ironmagma/quintodrome.git

# 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-py.
#
# IMPORTANT: Due to a limitation in extism-py, you cannot import this file directly.
# The @extism.import_fn decorators are only detected when defined in the plugin's
# main __init__.py file. Copy the needed functions from this file into your plugin.

from dataclasses import dataclass
from typing import Any

import extism
import json
{{- if .Service.HasByteFields}}
import base64
{{- end}}


class HostFunctionError(Exception):
    """Raised when a host function returns an error."""
    pass

{{- /* Generate raw host function imports */ -}}
{{range .Service.Methods}}


@extism.import_fn("extism:host/user", "{{exportName .}}")
def _{{exportName .}}(offset: int) -> int:
    """Raw host function - do not call directly."""
    ...
{{- end}}
{{- /* Generate dataclasses for multi-value returns */ -}}
{{range .Service.Methods}}
{{- if .NeedsResultClass}}


@dataclass
class {{pythonResultType .}}:
    """Result type for {{pythonFunc .}}."""
{{- range .Returns}}
    {{.PythonName}}: {{.PythonType}}
{{- end}}
{{- end}}
{{- end}}
{{- /* Generate wrapper functions */ -}}
{{range .Service.Methods}}


def {{pythonFunc .}}({{range $i, $p := .Params}}{{if $i}}, {{end}}{{$p.PythonName}}: {{$p.PythonType}}{{end}}){{if .NeedsResultClass}} -> {{pythonResultType .}}{{else if .HasReturns}} -> {{(index .Returns 0).PythonType}}{{else}} -> None{{end}}:
    """{{if .Doc}}{{.Doc}}{{else}}Call the {{exportName .}} host function.{{end}}
{{- if .HasParams}}

    Args:
{{- range .Params}}
        {{.PythonName}}: {{.PythonType}} parameter.
{{- end}}
{{- end}}
{{- if .HasReturns}}

    Returns:
{{- if .NeedsResultClass}}
        {{pythonResultType .}} containing{{range .Returns}} {{.PythonName}},{{end}}.
{{- else}}
        {{(index .Returns 0).PythonType}}: The result value.
{{- end}}
{{- end}}

    Raises:
        HostFunctionError: If the host function returns an error.
    """
{{- if .HasParams}}
    request = {
{{- range .Params}}
{{- if .IsByteSlice}}
        "{{.JSONName}}": base64.b64encode({{.PythonName}}).decode("ascii"),
{{- else}}
        "{{.JSONName}}": {{.PythonName}},
{{- end}}
{{- end}}
    }
    request_bytes = json.dumps(request).encode("utf-8")
{{- else}}
    request_bytes = b"{}"
{{- end}}
    request_mem = extism.memory.alloc(request_bytes)
    response_offset = _{{exportName .}}(request_mem.offset)
    response_mem = extism.memory.find(response_offset)
    response = json.loads(extism.memory.string(response_mem))
{{if .HasError}}
    if response.get("error"):
        raise HostFunctionError(response["error"])
{{end}}
{{- if .NeedsResultClass}}
    return {{pythonResultType .}}(
{{- range .Returns}}
{{- if .IsByteSlice}}
        {{.PythonName}}=base64.b64decode(response.get("{{.JSONName}}", "")),
{{- else}}
        {{.PythonName}}=response.get("{{.JSONName}}"{{pythonDefault .}}),
{{- end}}
{{- end}}
    )
{{- else if .HasReturns}}
{{- if (index .Returns 0).IsByteSlice}}
    return base64.b64decode(response.get("{{(index .Returns 0).JSONName}}", ""))
{{- else}}
    return response.get("{{(index .Returns 0).JSONName}}"{{pythonDefault (index .Returns 0)}})
{{- end}}
{{- end}}
{{- end}}