Anybitsthataren'tpartofacontainedflagwillbeformattedasahexnumber.
*/ pubfn to_writer<B: Flags>(flags: &B, mut writer: impl Write) -> Result<(), fmt::Error> where
B::Bits: WriteHex,
{ // A formatter for bitflags that produces text output like: // // A | B | 0xf6 // // The names of set flags are written in a bar-separated-format, // followed by a hex number of any remaining bits that are set // but don't correspond to any flags.
// Iterate over known flag values letmut first = true; letmut iter = flags.iter_names(); for (name, _) in &mut iter { if !first {
writer.write_str(" | ")?;
}
first = false;
writer.write_str(name)?;
}
// Append any extra bits that correspond to flags to the end of the format let remaining = iter.remaining().bits(); if remaining != B::Bits::EMPTY { if !first {
writer.write_str(" | ")?;
}
// If the input is empty then return an empty set of flags if input.trim().is_empty() { return Ok(parsed_flags);
}
for flag in input.split('|') { let flag = flag.trim();
// If the flag is empty then we've got missing input if flag.is_empty() { return Err(ParseError::empty_flag());
}
// If the flag starts with `0x` then it's a hex number // Parse it directly to the underlying bits type let parsed_flag = iflet Some(flag) = flag.strip_prefix("0x") { let bits =
<B::Bits>::parse_hex(flag).map_err(|_| ParseError::invalid_hex_flag(flag))?;
B::from_bits_retain(bits)
} // Otherwise the flag is a name // The generated flags type will determine whether // or not it's a valid identifier else {
B::from_name(flag).ok_or_else(|| ParseError::invalid_named_flag(flag))?
};
/** Writeonlythecontained,defined,namedflagsinaflagsvalueastext.
*/ pubfn to_writer_strict<B: Flags>(flags: &B, mut writer: impl Write) -> Result<(), fmt::Error> { // This is a simplified version of `to_writer` that ignores // any bits not corresponding to a named flag
letmut first = true; letmut iter = flags.iter_names(); for (name, _) in &mut iter { if !first {
writer.write_str(" | ")?;
}
first = false;
writer.write_str(name)?;
}
fmt::Result::Ok(())
}
/** Parseaflagsvaluefromtext.
Thisfunctionwillfailonanynamesthatdon'tcorrespondtodefinedflags. Thisfunctionwillfailtoparsehexvalues.
*/ pubfn from_str_strict<B: Flags>(input: &str) -> Result<B, ParseError> { // This is a simplified version of `from_str` that ignores // any bits not corresponding to a named flag
letmut parsed_flags = B::empty();
// If the input is empty then return an empty set of flags if input.trim().is_empty() { return Ok(parsed_flags);
}
for flag in input.split('|') { let flag = flag.trim();
// If the flag is empty then we've got missing input if flag.is_empty() { return Err(ParseError::empty_flag());
}
// If the flag starts with `0x` then it's a hex number // These aren't supported in the strict parser if flag.starts_with("0x") { return Err(ParseError::invalid_hex_flag("unsupported hex flag value"));
}
let parsed_flag = B::from_name(flag).ok_or_else(|| ParseError::invalid_named_flag(flag))?;
parsed_flags.insert(parsed_flag);
}
Ok(parsed_flags)
}
/** Encodeavalueasahexstring.
Implementorsofthistraitshouldnotwritethe`0x`prefix.
*/ pubtrait WriteHex { /// Write the value as hex. fn write_hex<W: fmt::Write>(&self, writer: W) -> fmt::Result;
}
/** Parseavaluefromahexstring.
*/ pubtrait ParseHex { /// Parse the value from hex. fn parse_hex(input: &str) -> Result<Self, ParseError> where Self: Sized;
}
/// An error encountered while parsing flags from text. #[derive(Debug)] pubstruct ParseError(ParseErrorKind);
/// A named flag that doesn't correspond to any on the flags type was encountered. pubfn invalid_named_flag(flag: impl fmt::Display) -> Self { let _flag = flag;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.