anchor.diff:      let getBytes (IpAddress ip) = getBytes ip |> Result.get
   
   module PositiveInt =
  +    /// 0 is inclusive
       type T = PositiveInt of uint64
   
       type Error =
  
positive.code:     match dcpp_message with
      | DcppSendMessage.Search s_msg ->
          [
              "$Search " |> getBytes |> Result.get;
              IpAddress.getBytes s_msg.listen_info.ip;
              ":" |> getBytes |> Result.get;
              (PortData.unwrap s_msg.listen_info.port).ToString() |> getBytes |> Result.get;
              " " |> getBytes |> Result.get;
              "F?F?0?1?" |> getBytes |> Result.get;
              s_msg.search_str |> getBytes |> Result.get; // TODO validate search_str
              "$$" |> getBytes |> Result.get;
              "|" |> getBytes |> Result.get
          ]
          |> Array.concat
      | DcppSendMessage.MyPass mp_msg ->
          [
              "$MyPass " |> getBytes |> Result.get;
              PasswordData.apply ASCIIString.getBytes mp_msg.password;
              "|" |> getBytes |> Result.get
          ]
          |> Array.concat
  
      | DcppSendMessage.ValidateNick vn_msg ->
          [
              "$Key " |> getBytes |> Result.get;
              KeyData.unwrap vn_msg.key;
              "|$ValidateNick " |> getBytes |> Result.get;
              NickData.apply ASCIIString.getBytes vn_msg.nick;
              "|" |> getBytes |> Result.get
          ]
          |> Array.concat
  
negative.code: | Version
  | MyInfo of MyInfoMessage
  | Search of SearchMessage
  | ConnectToMe of ConnectToMeMessage
  | MyNick of MyNickMessage
  | Get of GetMessage
  | Lock of LockMessage
  | Send
  | Direction of DirectionMessage
  | Key of KeyMessage
  
  type SendAction =
  | SendNick of NickData.T * KeyData.T
  