This is useful for me, because you can implement the LiquidHandler interface and then basically just use the exact functions of PLR. Allows intercepting calls to do things like liquid tracking and serialization of full state.
I’ve learned a few things while building this, which I’ll briefly put:
the protobuf definitions are the most important. With a good interface description, generation works great.
you can autonomously test by creating fake serial backends and then check RemoteClient vs Local. This is more useful than the other tests it produces and usually guarantees, to some degree, that the interfaces are functionally compatible
the hardest part is creating the nice interface for humans. While client/server can be generated from protobuf, you need to implement server (can be done autonomously by making serial-comparisons), and you need to make sure the user-facing interface is correct. This takes a shit ton of boiler plate on top of the autogenerated client, but is very easy to do. plr-interace → client-interface -> server -> serial