Mining/pkg/node/protocol.go
Claude 7a87f2e633
Some checks failed
Test / test (push) Waiting to run
Security Scan / security (push) Has been cancelled
ax(node): replace prose comments with usage examples in protocol.go
ValidateResponse, ParseResponse, and GetProtocolErrorCode had comments
that restated the function signature in prose — violating AX Principle 2
which requires comments to show concrete call-site usage, not descriptions.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 10:28:54 +01:00

86 lines
2.5 KiB
Go

package node
import (
"fmt"
)
// if pe, ok := err.(*ProtocolError); ok { log(pe.Code, pe.Message) }
type ProtocolError struct {
Code int
Message string
}
func (e *ProtocolError) Error() string {
return fmt.Sprintf("remote error (%d): %s", e.Code, e.Message)
}
// handler := &ResponseHandler{}
// if err := handler.ValidateResponse(resp, MsgPong); err != nil { return 0, err }
type ResponseHandler struct{}
// if err := handler.ValidateResponse(resp, MsgPong); err != nil { return 0, err }
func (h *ResponseHandler) ValidateResponse(resp *Message, expectedType MessageType) error {
if resp == nil {
return fmt.Errorf("nil response")
}
// Check for error response
if resp.Type == MsgError {
var errPayload ErrorPayload
if err := resp.ParsePayload(&errPayload); err != nil {
return &ProtocolError{Code: ErrCodeUnknown, Message: "unable to parse error response"}
}
return &ProtocolError{Code: errPayload.Code, Message: errPayload.Message}
}
// Check expected type
if resp.Type != expectedType {
return fmt.Errorf("unexpected response type: expected %s, got %s", expectedType, resp.Type)
}
return nil
}
// var stats StatsPayload
// if err := handler.ParseResponse(resp, MsgStats, &stats); err != nil { return nil, err }
func (h *ResponseHandler) ParseResponse(resp *Message, expectedType MessageType, target interface{}) error {
if err := h.ValidateResponse(resp, expectedType); err != nil {
return err
}
if target != nil {
if err := resp.ParsePayload(target); err != nil {
return fmt.Errorf("failed to parse %s payload: %w", expectedType, err)
}
}
return nil
}
// DefaultResponseHandler is the default response handler instance.
var DefaultResponseHandler = &ResponseHandler{}
// if err := ValidateResponse(resp, MsgPong); err != nil { return 0, err }
func ValidateResponse(resp *Message, expectedType MessageType) error {
return DefaultResponseHandler.ValidateResponse(resp, expectedType)
}
// var stats StatsPayload
// if err := ParseResponse(resp, MsgStats, &stats); err != nil { return nil, err }
func ParseResponse(resp *Message, expectedType MessageType, target interface{}) error {
return DefaultResponseHandler.ParseResponse(resp, expectedType, target)
}
// if node.IsProtocolError(err) { log("remote code:", node.GetProtocolErrorCode(err)) }
func IsProtocolError(err error) bool {
_, ok := err.(*ProtocolError)
return ok
}
// code := GetProtocolErrorCode(err) // 0 when err is not a ProtocolError
func GetProtocolErrorCode(err error) int {
if pe, ok := err.(*ProtocolError); ok {
return pe.Code
}
return 0
}