@@ -1136,6 +1136,123 @@ pub extern "C" fn seds_pkt_data_ptr(
11361136 view. payload as * const c_void
11371137}
11381138
1139+
1140+ macro_rules! impl_seds_pkt_get_typed_from_packet {
1141+ ( $fname: ident, $method: ident, $ty: ty) => {
1142+ #[ unsafe ( no_mangle) ]
1143+ pub extern "C" fn $fname(
1144+ pkt: * const SedsPacketView ,
1145+ out: * mut $ty,
1146+ out_elems: usize ,
1147+ ) -> i32 {
1148+ // Basic arg check
1149+ if pkt. is_null( ) {
1150+ return status_from_err( TelemetryError :: BadArg ) ;
1151+ }
1152+
1153+ let view = unsafe { & * pkt } ;
1154+ let tpkt = match view_to_packet( view) {
1155+ Ok ( p) => p,
1156+ Err ( _) => return status_from_err( TelemetryError :: BadArg ) ,
1157+ } ;
1158+
1159+ let vals = match tpkt. $method( ) {
1160+ Ok ( v) => v,
1161+ Err ( e) => return status_from_err( e) ,
1162+ } ;
1163+
1164+ let needed = vals. len( ) ;
1165+
1166+ // No payload => nothing to copy
1167+ if needed == 0 {
1168+ return 0 ;
1169+ }
1170+
1171+ // Query / too-small: return required element count
1172+ if out. is_null( ) || out_elems == 0 || out_elems < needed {
1173+ return needed as i32 ;
1174+ }
1175+
1176+ unsafe {
1177+ ptr:: copy_nonoverlapping( vals. as_ptr( ) , out, needed) ;
1178+ }
1179+
1180+ needed as i32
1181+ }
1182+ } ;
1183+ }
1184+
1185+
1186+ // Typed getters using TelemetryPacket's data_as_* helpers.
1187+ // All use "query" semantics like seds_pkt_copy_data:
1188+ // - If out is NULL or out_elems < needed, return needed (element count) and do not copy.
1189+ // - On success, return the number of elements written.
1190+
1191+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_f32, data_as_f32, f32 ) ;
1192+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_f64, data_as_f64, f64 ) ;
1193+
1194+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_u8, data_as_u8, u8 ) ;
1195+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_u16, data_as_u16, u16 ) ;
1196+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_u32, data_as_u32, u32 ) ;
1197+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_u64, data_as_u64, u64 ) ;
1198+
1199+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_i8, data_as_i8, i8 ) ;
1200+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_i16, data_as_i16, i16 ) ;
1201+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_i32, data_as_i32, i32 ) ;
1202+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_i64, data_as_i64, i64 ) ;
1203+
1204+ impl_seds_pkt_get_typed_from_packet ! ( seds_pkt_get_bool, data_as_bool, bool ) ;
1205+
1206+ #[ unsafe( no_mangle) ]
1207+ pub extern "C" fn seds_pkt_get_string (
1208+ pkt : * const SedsPacketView ,
1209+ buf : * mut c_char ,
1210+ buf_len : usize ,
1211+ ) -> i32 {
1212+ if pkt. is_null ( ) {
1213+ return status_from_err ( TelemetryError :: BadArg ) ;
1214+ }
1215+
1216+ let view = unsafe { & * pkt } ;
1217+ let tpkt = match view_to_packet ( view) {
1218+ Ok ( p) => p,
1219+ Err ( _) => return status_from_err ( TelemetryError :: BadArg ) ,
1220+ } ;
1221+
1222+ let s = match tpkt. data_as_string ( ) {
1223+ Ok ( s) => s,
1224+ Err ( e) => return status_from_err ( e) ,
1225+ } ;
1226+
1227+ // Same semantics as the other string helpers:
1228+ // - if buf is NULL or buf_len == 0 → return required length (incl NUL)
1229+ // - if too small → write as much as fits + NUL, return required length
1230+ // - on success → return 0
1231+ unsafe { write_str_to_buf ( & s, buf, buf_len) }
1232+ }
1233+
1234+ #[ unsafe( no_mangle) ]
1235+ pub extern "C" fn seds_pkt_get_string_len (
1236+ pkt : * const SedsPacketView ,
1237+ ) -> i32 {
1238+ if pkt. is_null ( ) {
1239+ return status_from_err ( TelemetryError :: BadArg ) ;
1240+ }
1241+
1242+ let view = unsafe { & * pkt } ;
1243+ let tpkt = match view_to_packet ( view) {
1244+ Ok ( p) => p,
1245+ Err ( _) => return status_from_err ( TelemetryError :: BadArg ) ,
1246+ } ;
1247+
1248+ let s = match tpkt. data_as_string ( ) {
1249+ Ok ( s) => s,
1250+ Err ( e) => return status_from_err ( e) ,
1251+ } ;
1252+
1253+ ( s. len ( ) + 1 ) as i32
1254+ }
1255+
11391256/// Copy raw payload bytes into `dst`.
11401257///
11411258/// Query mode:
0 commit comments