Module wasmtime.bindgen

Expand source code
from .generated import Root, RootImports, Err, imports
from .generated.imports import streams
from .generated.imports.types import Descriptor, Filesize, ErrorCode, DescriptorType
from .generated.imports.terminal_input import TerminalInput
from .generated.imports.terminal_output import TerminalOutput
from .generated import types as core_types
from typing import Mapping, Tuple, List

import sys
import os
from wasmtime import Store


class WasiRandom(imports.HostRandom):
    def get_random_bytes(self, len: int) -> bytes:
        return os.urandom(len)


class WasiStdin(imports.HostStdin):
    def get_stdin(self) -> streams.InputStream:
        return 0


class WasiStdout(imports.HostStdout):
    def get_stdout(self) -> streams.OutputStream:
        return 1


class WasiStderr(imports.HostStderr):
    def get_stderr(self) -> streams.OutputStream:
        return 2


class WasiPreopens(imports.HostPreopens):
    def get_directories(self) -> List[Tuple[Descriptor, str]]:
        return []


class WasiStreams(imports.HostStreams):
    def drop_input_stream(self, this: streams.InputStream) -> None:
        return None

    def write(self, this: streams.OutputStream, buf: bytes) -> core_types.Result[Tuple[int, streams.StreamStatus], None]:
        if this == 1:
            sys.stdout.buffer.write(buf)
        elif this == 2:
            sys.stderr.buffer.write(buf)
        else:
            raise NotImplementedError
        return core_types.Ok((len(buf), streams.StreamStatus.OPEN))

    def blocking_write(self, this: streams.OutputStream, buf: bytes) -> core_types.Result[Tuple[int, streams.StreamStatus], None]:
        return self.write(this, buf)

    def drop_output_stream(self, this: streams.OutputStream) -> None:
        return None


class WasiEnvironment(imports.HostEnvironment):
    def get_environment(self) -> List[Tuple[str, str]]:
        return []


class WasiTypes(imports.HostTypes):
    def write_via_stream(self, this: Descriptor, offset: Filesize) -> core_types.Result[streams.OutputStream, ErrorCode]:
        raise NotImplementedError

    def append_via_stream(self, this: Descriptor) -> core_types.Result[streams.OutputStream, ErrorCode]:
        raise NotImplementedError

    def get_type(self, this: Descriptor) -> core_types.Result[DescriptorType, ErrorCode]:
        raise NotImplementedError

    def drop_descriptor(self, this: Descriptor) -> None:
        raise NotImplementedError


class WasiExit(imports.HostExit):
    def exit(self, status: core_types.Result[None, None]) -> None:
        raise NotImplementedError


class WasiTerminalInput(imports.HostTerminalInput):
    def drop_terminal_input(self, this: TerminalInput) -> None:
        raise NotImplementedError


class WasiTerminalOutput(imports.HostTerminalOutput):
    def drop_terminal_output(self, this: TerminalOutput) -> None:
        raise NotImplementedError


class WasiTerminalStdin(imports.HostTerminalStdin):
    def get_terminal_stdin(self) -> None:
        raise NotImplementedError


class WasiTerminalStdout(imports.HostTerminalStdout):
    def get_terminal_stdout(self) -> None:
        raise NotImplementedError


class WasiTerminalStderr(imports.HostTerminalStderr):
    def get_terminal_stderr(self) -> None:
        raise NotImplementedError


root = None
store = None


def init() -> Tuple[Root, Store]:
    global store
    global root
    if root is None:
        store = Store()
        root = Root(store, RootImports(WasiStreams(),
                                       WasiTypes(),
                                       WasiPreopens(),
                                       WasiRandom(),
                                       WasiEnvironment(),
                                       WasiExit(),
                                       WasiStdin(),
                                       WasiStdout(),
                                       WasiStderr(),
                                       WasiTerminalInput(),
                                       WasiTerminalOutput(),
                                       WasiTerminalStdin(),
                                       WasiTerminalStdout(),
                                       WasiTerminalStderr()))
    return root, store


# Generates Python bindings for the given component.
#
# The `name` provided is used as the name of the `component` binary provided.
# The `component` argument is expected to be the binary representation of a
# component.
#
# This function returns a mapping of filename to contents of files that are
# generated to represent the Python bindings here.
def generate(name: str, component: bytes) -> Mapping[str, bytes]:
    root, store = init()
    result = root.generate(store, name, component)
    if isinstance(result, Err):
        raise RuntimeError(result.value)
    ret = {}
    for name, contents in result.value:
        ret[name] = contents
    return ret


__all__ = ['generate']

Sub-modules

wasmtime.bindgen.generated

Functions

def generate(name: str, component: bytes) ‑> Mapping[str, bytes]
Expand source code
def generate(name: str, component: bytes) -> Mapping[str, bytes]:
    root, store = init()
    result = root.generate(store, name, component)
    if isinstance(result, Err):
        raise RuntimeError(result.value)
    ret = {}
    for name, contents in result.value:
        ret[name] = contents
    return ret