Encodes and attempts to write the most efficient representation of the given Value. # Note All instances of `ErrorKind::Interrupted` are handled by this function and the underlying operation is retried. TODO: Docs. Examples.
(wr: &mut W, val: &Value)
| 856 | /// operation is retried. |
| 857 | // TODO: Docs. Examples. |
| 858 | pub fn write_value<W>(wr: &mut W, val: &Value) -> Result<(), Error> |
| 859 | where W: Write |
| 860 | { |
| 861 | match val { |
| 862 | &Value::Nil => try!(write_nil(wr)), |
| 863 | &Value::Boolean(val) => try!(write_bool(wr, val)), |
| 864 | // TODO: Replace with generic write_int(...). |
| 865 | &Value::Integer(Integer::U64(val)) => { |
| 866 | try!(write_uint(wr, val)); |
| 867 | } |
| 868 | &Value::Integer(Integer::I64(val)) => { |
| 869 | try!(write_sint(wr, val)); |
| 870 | } |
| 871 | // TODO: Replace with generic write_float(...). |
| 872 | &Value::Float(Float::F32(val)) => try!(write_f32(wr, val)), |
| 873 | &Value::Float(Float::F64(val)) => try!(write_f64(wr, val)), |
| 874 | &Value::String(ref val) => { |
| 875 | try!(write_str(wr, &val)); |
| 876 | } |
| 877 | &Value::Binary(ref val) => { |
| 878 | try!(write_bin(wr, &val)); |
| 879 | } |
| 880 | &Value::Array(ref val) => { |
| 881 | try!(write_array_len(wr, val.len() as u32)); |
| 882 | for item in val { |
| 883 | try!(write_value(wr, item)); |
| 884 | } |
| 885 | } |
| 886 | &Value::Map(ref val) => { |
| 887 | try!(write_map_len(wr, val.len() as u32)); |
| 888 | for &(ref key, ref val) in val { |
| 889 | try!(write_value(wr, key)); |
| 890 | try!(write_value(wr, val)); |
| 891 | } |
| 892 | } |
| 893 | &Value::Ext(ty, ref data) => { |
| 894 | try!(write_ext_meta(wr, data.len() as u32, ty)); |
| 895 | try!(wr.write_all(data).map_err(|err| ValueWriteError::InvalidDataWrite(WriteError(err)))); |
| 896 | } |
| 897 | } |
| 898 | |
| 899 | Ok(()) |
| 900 | } |
| 901 | |
| 902 | } // mod value |
| 903 |