# `Hyper.Grpc.Codec`
[🔗](https://github.com/harmont-dev/hyper/blob/main/lib/hyper/grpc/codec.ex#L1)

Translation between the gRPC wire types (`Hyper.Grpc.V0.*`) and Hyper's domain
types. Two entry points, each dispatching by pattern match on the value's type:

  * `from_grpc/1` -- an inbound request message -> a domain value.
  * `to_grpc/1`   -- a domain result (or error) -> an outbound response message,
    or a `GRPC.RPCError` for the server to raise.

# `from_grpc`

```elixir
@spec from_grpc(Hyper.Grpc.V0.CreateVmRequest.t()) ::
  {:ok, Hyper.Vm.Spec.t()} | {:error, term()}
@spec from_grpc(Hyper.Grpc.V0.LoadImageRequest.t()) ::
  {:ok, {String.t(), keyword()}} | {:error, :missing_image_ref}
```

Convert an inbound request message to a domain value.

# `to_grpc`

```elixir
@spec to_grpc({:created, Hyper.Vm.Id.t(), node()}) ::
  Hyper.Grpc.V0.CreateVmResponse.t()
@spec to_grpc({:forked, Hyper.Vm.Id.t(), node()}) :: Hyper.Grpc.V0.ForkVmResponse.t()
@spec to_grpc({:located, Hyper.Vm.Id.t(), node()}) :: Hyper.Grpc.V0.GetVmResponse.t()
@spec to_grpc({:usage, Hyper.Vm.Id.t(), Unit.Time.t()}) ::
  Hyper.Grpc.V0.GetVmUsageResponse.t()
@spec to_grpc({:vms, [{Hyper.Vm.Id.t(), node()}]}) ::
  Hyper.Grpc.V0.ListVmsResponse.t()
@spec to_grpc({:loaded, Hyper.Img.id()}) :: Hyper.Grpc.V0.LoadImageResponse.t()
@spec to_grpc(:stopped) :: Google.Protobuf.Empty.t()
@spec to_grpc({:error, term()}) :: GRPC.RPCError.t()
```

Convert a domain result to an outbound response message, or an error to `GRPC.RPCError`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
