code.icb4dc0.de/buildr/wasi-module-sdk-go@v0.0.0-20230524201105-cc52d195017b/state_proxy.go (about)

     1  package sdk
     2  
     3  import (
     4  	"errors"
     5  
     6  	rpcv1 "code.icb4dc0.de/buildr/wasi-module-sdk-go/protocol/generated/rpc/v1"
     7  
     8  	"code.icb4dc0.de/buildr/wasi-module-sdk-go/mem"
     9  )
    10  
    11  type StateProxy struct {
    12  }
    13  
    14  func (s StateProxy) Set(key, state []byte) error {
    15  	setCmd := &rpcv1.SetState{
    16  		Key:  key,
    17  		Data: state,
    18  	}
    19  	data, err := setCmd.MarshalVT()
    20  	if err != nil {
    21  		return err
    22  	}
    23  
    24  	result := _set_state(mem.DataToManagedPtr(data))
    25  	if result == 0 {
    26  		return errors.New("unknown error occurred")
    27  	}
    28  	resultPtr := uint32(result >> 32)
    29  	resultSize := uint32(result)
    30  
    31  	if resultSize == 0 {
    32  		return nil
    33  	}
    34  
    35  	resultMsg := new(rpcv1.Result)
    36  	if err := resultMsg.UnmarshalVT(mem.PtrToData(resultPtr, resultSize)); err != nil {
    37  		return err
    38  	}
    39  
    40  	if !resultMsg.Success {
    41  		if resultMsg.Error != "" {
    42  			return errors.New(resultMsg.Error)
    43  		}
    44  		return errors.New("unknown error occurred")
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  func (s StateProxy) Get(key []byte) (state []byte, meta StateMetadata, err error) {
    51  	getCmd := &rpcv1.GetStateRequest{
    52  		Key: key,
    53  	}
    54  
    55  	data, err := getCmd.MarshalVT()
    56  	if err != nil {
    57  		return nil, StateMetadata{}, err
    58  	}
    59  
    60  	result := _get_state(mem.DataToManagedPtr(data))
    61  	if result == 0 {
    62  		return nil, StateMetadata{}, errors.New("error occurred while processing request")
    63  	}
    64  	resultPtr := uint32(result >> 32)
    65  	resultSize := uint32(result)
    66  
    67  	if resultSize == 0 {
    68  		return nil, StateMetadata{}, nil
    69  	}
    70  
    71  	getStateResult := new(rpcv1.GetStateResponse)
    72  	if err := getStateResult.UnmarshalVT(mem.PtrToData(resultPtr, resultSize)); err != nil {
    73  		return nil, StateMetadata{}, err
    74  	}
    75  
    76  	return getStateResult.Data, StateMetadata{}, nil
    77  }