+#[derive(Clone, Debug)]
+pub enum MultipleResponseType {
+ MultipleDichotomy {
+ value: Value,
+ labels: CategoryLabels,
+ },
+ MultipleCategory,
+}
+
+#[derive(Clone, Debug)]
+pub struct MultipleResponseSet {
+ pub name: Identifier,
+ pub label: String,
+ pub mr_type: MultipleResponseType,
+ pub dict_indexes: Vec<DictIndex>,
+}
+
+impl MultipleResponseSet {
+ fn decode(
+ decoder: &Decoder,
+ input: &raw::MultipleResponseSet,
+ warn: &impl Fn(Error),
+ ) -> Result<Option<Self>, Error> {
+ let mr_set_name = decoder
+ .decode_identifier(&input.name.0, warn)
+ .map_err(|error| Error::InvalidMrSetName(error))?;
+
+ let label = decoder.decode_string(&input.label.0, warn).into();
+
+ let dict_indexes = Vec::with_capacity(input.short_names.len());
+ for &short_name in input.short_names.iter() {
+ let short_name = match decoder.decode_identifier(&short_name.0, warn) {
+ Ok(name) => name,
+ Err(error) => {
+ warn(Error::InvalidMrSetName(error));
+ continue;
+ }
+ };
+ let Some(dict_index) = decoder.var_names.get(&short_name) else {
+ warn(Error::UnknownMrSetVariable {
+ mr_set: mr_set_name.clone(),
+ short_name: short_name.clone(),
+ });
+ continue;
+ };
+ dict_indexes.push(dict_index);
+ }
+
+ match dict_indexes.len() {
+ 0 => return Err(Error::EmptyMrSet(mr_set_name)),
+ 1 => return Err(Error::OneVarMrSet(mr_set_name)),
+ _ => (),
+ }
+
+ let Some(var_width) = dict_indexes
+ .iter()
+ .map(|&dict_index| Some(decoder.variables[dict_index].width))
+ .reduce(|a, b| VarWidth::wider(a, b))
+ .flatten()
+ else {
+ return Err(Error::MixedMrSet(mr_set_name));
+ };
+ }
+}
+
+#[derive(Clone, Debug)]
+pub struct MultipleResponseRecord(Vec<MultipleResponseSet>);
+
+impl Decode for MultipleResponseRecord {
+ type Input = raw::MultipleResponseRecord;
+
+ fn decode(decoder: &Decoder, input: &Self::Input, warn: impl Fn(Error)) -> Result<Self, Error> {
+ }
+}
+