xai-org/x-algorithm · error

Not implemented: to_thrift for Action

Error message

Not implemented: to_thrift for Action

What it means

Action's MValCodec implementation is decode-only; calling to_thrift panics with an explicit 'not implemented' message. The type is meant to be read from Thrift responses, not written back.

Solutions

  1. Do not serialize Action via this codec.
  2. Implement to_thrift by writing the same discriminators/tags the from_thrift reader consumes.
  3. Use the protobuf equivalent (vf_pb) if wire serialization is required.

Example fix

// before
fn to_thrift(&self, _proto: &mut dyn TOutputProtocol) {
    panic!("Not implemented: to_thrift for Action")
}

// after
fn to_thrift(&self, proto: &mut dyn TOutputProtocol) {
    // write the same tag/discriminator layout from_thrift parses
    proto.write_struct_begin(&TStructIdentifier::new("Action")).unwrap();
    /* field writes mirroring the reader */
    proto.write_field_stop().unwrap();
    proto.write_struct_end().unwrap();
}
Defensive patterns

Strategy: type-guard

Type guard

trait WriteCodec { fn to_thrift(&self, p: &mut dyn TOutputProtocol); }
// Action does not implement WriteCodec -> accidental encode fails at compile time

Try / catch

let r = std::panic::catch_unwind(|| a.to_thrift(proto));
if r.is_err() { /* skip field or use protobuf representation */ }

Prevention

When it happens

Trigger: Encoding an Action enum/struct via MValCodec::to_thrift — e.g. persisting it, sending it in a request, or a round-trip serialization test.

Common situations: Generic serializers that iterate all codec impls; new code forwarding Action values over Thrift; test utilities asserting encode/decode symmetry.

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/41035907e64b7a89. Report an issue: GitHub.

Appendix: source

Thrown at visibility-filtering-client/models.rs:255

                        proto.read_field_end().unwrap();
                    }
                    proto.read_struct_end().unwrap();
                    if has_avoid {
                        result = Action::Avoid;
                    }
                }
                _ => {
                    proto.skip(field.field_type).unwrap();
                }
            }
            proto.read_field_end().unwrap();
        }
        proto.read_struct_end().unwrap();
        result
    }

    fn to_thrift(&self, _proto: &mut dyn TOutputProtocol) {
        panic!("Not implemented: to_thrift for Action")
    }
}

impl MValCodec for DropReason {
    fn thrift_type() -> TType {
        TType::Struct
    }

    fn from_thrift(proto: &mut dyn TInputProtocol) -> Self {
        proto.read_struct_begin().unwrap();
        loop {
            let field = proto.read_field_begin().unwrap();
            if field.field_type == TType::Stop {
                break;
            }
            proto.skip(field.field_type).unwrap();
            proto.read_field_end().unwrap();
        }

View on GitHub (pinned to 24c60942c5)