/**
* Deserialises the JSON shape Rust's serde derives for {@code std::time::Duration}
* ({@code {"secs": <u64>, "nanos": <u32>}}) into a millisecond count.
*
* <p>Annotate any {@code Long} field that represents a Rust {@code Duration} with
* {@code @JsonDeserialize(using = DurationMillisDeserializer.class)}.
*/
@SuppressWarnings("PMD")
public class DurationMillisDeserializer extends JsonDeserializer<Long> {
@Override
public Long deserialize(final JsonParser parser, final DeserializationContext ctx)
throws java.io.IOException {
final JsonNode node = parser.getCodec().readTree(parser);
final long secs = node.get("secs").asLong();
final JsonNode nanosNode = node.get("nanos");
final long nanos = nanosNode == null ? 0L : nanosNode.asLong();
return (secs * 1000L) + (nanos / 1_000_000L);
}
}