FloatInfo(FloatInfoRecord),
VariableSets(TextRecord),
VarDisplay(VarDisplayRecord),
- MultipleResponse(MultipleResponseRecord),
+ MultipleResponse(MultipleResponseRecord<RawString>),
LongStringValueLabels(LongStringValueLabelRecord),
LongStringMissingValues(LongStringMissingValueRecord),
Encoding(EncodingRecord),
}
#[derive(Clone, Debug)]
-pub struct MultipleResponseSet {
- pub name: RawString,
- pub label: RawString,
+pub struct MultipleResponseSet<S>
+where
+ S: Debug,
+{
+ pub name: S,
+ pub label: S,
pub mr_type: MultipleResponseType,
- pub short_names: Vec<RawString>,
+ pub short_names: Vec<S>,
}
-impl MultipleResponseSet {
- fn parse(input: &[u8]) -> Result<(MultipleResponseSet, &[u8]), Error> {
+impl MultipleResponseSet<RawString> {
+ fn parse(input: &[u8]) -> Result<(Self, &[u8]), Error> {
let Some(equals) = input.iter().position(|&b| b == b'=') else {
return Err(Error::TBD);
};
input,
))
}
+
+ fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseSet<Cow<'a, str>> {
+ MultipleResponseSet {
+ name: decoder.decode(&self.name),
+ label: decoder.decode(&self.label),
+ mr_type: self.mr_type.clone(),
+ short_names: self.short_names.iter().map(|s| decoder.decode(s)).collect(),
+ }
+ }
}
#[derive(Clone, Debug)]
-pub struct MultipleResponseRecord(pub Vec<MultipleResponseSet>);
+pub struct MultipleResponseRecord<S>(pub Vec<MultipleResponseSet<S>>)
+where
+ S: Debug;
-impl ExtensionRecord for MultipleResponseRecord {
+impl ExtensionRecord for MultipleResponseRecord<RawString> {
const SUBTYPE: u32 = 7;
const SIZE: Option<u32> = Some(1);
const COUNT: Option<u32> = None;
}
}
+impl MultipleResponseRecord<RawString> {
+ fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseRecord<Cow<'a, str>> {
+ MultipleResponseRecord(self.0.iter().map(|set| set.decode(decoder)).collect())
+ }
+}
+
fn parse_counted_string(input: &[u8]) -> Result<(RawString, &[u8]), Error> {
let Some(space) = input.iter().position(|&b| b == b' ') else {
return Err(Error::TBD);