Skip to content

Commit bf50add

Browse files
committed
Fixed some errors in emitter
1 parent 90df366 commit bf50add

File tree

2 files changed

+54
-19
lines changed

2 files changed

+54
-19
lines changed

src/writer/emitter.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::io;
22
use std::iter;
3+
use std::fmt;
34

45
use common;
56
use common::{XmlVersion, Attribute, Name, escape_str};
@@ -20,6 +21,17 @@ pub struct EmitterError {
2021
cause: Option<io::IoError>
2122
}
2223

24+
impl fmt::Show for EmitterError {
25+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
26+
try!(write!(f, "Emitter error: {}", self.message));
27+
if self.cause.is_some() {
28+
write!(f, "; caused by: {}", *self.cause.get_ref())
29+
} else {
30+
Ok(())
31+
}
32+
}
33+
}
34+
2335
pub fn error(kind: EmitterErrorKind, message: &'static str) -> EmitterError {
2436
EmitterError {
2537
kind: kind,
@@ -51,16 +63,18 @@ pub struct Emitter {
5163
start_document_emitted: bool
5264
}
5365

54-
pub fn new(config: EmitterConfig) -> Emitter {
55-
Emitter {
56-
config: config,
66+
impl Emitter {
67+
pub fn new(config: EmitterConfig) -> Emitter {
68+
Emitter {
69+
config: config,
5770

58-
nst: NamespaceStack::empty(),
71+
nst: NamespaceStack::empty(),
5972

60-
indent_level: 0,
61-
indent_stack: vec!(),
73+
indent_level: 0,
74+
indent_stack: vec!(IndentFlags::empty()),
6275

63-
start_document_emitted: false
76+
start_document_emitted: false
77+
}
6478
}
6579
}
6680

@@ -261,15 +275,7 @@ impl Emitter {
261275
namespace: &'a N) -> EmitterResult<()> {
262276
try!(self.emit_start_element_initial(target, name, attributes, namespace));
263277

264-
try!(self.check_document_started(target));
265-
266-
wrapped_with!(self; before_start_element(target) and after_start_element, {
267-
io_try!(write!(target, "<{}", name.to_str_proper()));
268-
269-
try!(self.emit_namespace_attributes(target, namespace));
270-
271-
self.emit_attributes(target, attributes)
272-
})
278+
io_wrap(write!(target, ">"))
273279
}
274280

275281
pub fn emit_namespace_attributes<'a, W: Writer,
@@ -278,16 +284,19 @@ impl Emitter {
278284
>(&mut self, target: &mut W, namespace: &'a N) -> EmitterResult<()> {
279285
for (prefix, uri) in namespace.uri_mappings() {
280286
io_try!(match prefix {
287+
Some("xmlns") | Some("xml") => Ok(()), // emit nothing
281288
Some(prefix) => write!(target, " xmlns:{}=\"{}\"", prefix, uri),
282-
None => write!(target, " xmlns=\"{}\"", uri)
289+
None => if !uri.is_empty() { // emit xmlns only if it is overridden
290+
write!(target, " xmlns=\"{}\"", uri)
291+
} else { Ok(()) }
283292
});
284293
}
285294
Ok(())
286295
}
287296

288297
pub fn emit_attributes<W: Writer>(&mut self, target: &mut W, attributes: &[Attribute]) -> EmitterResult<()> {
289298
for attr in attributes.iter() {
290-
io_try!(write!(target, " {}=\"{}\"", attr.name.to_str_proper(), escape_str(attr.value.as_slice())));
299+
io_try!(write!(target, " {}=\"{}\"", attr.name.to_str_proper(), escape_str(attr.value.as_slice())))
291300
}
292301
Ok(())
293302
}

src/writer/mod.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ impl<W: Writer> EventWriter<W> {
2525
pub fn new_with_config(sink: W, config: EmitterConfig) -> EventWriter<W> {
2626
EventWriter {
2727
sink: sink,
28-
emitter: emitter::new(config)
28+
emitter: Emitter::new(config)
2929
}
3030
}
3131

@@ -60,3 +60,29 @@ impl EventWriter<MemWriter> {
6060
EventWriter::new_with_config(sink, config)
6161
}
6262
}
63+
64+
#[cfg(test)]
65+
mod tests {
66+
use std::io;
67+
use std::io::{File, BufferedReader};
68+
69+
use reader::EventReader;
70+
use writer::EventWriter;
71+
72+
#[test]
73+
fn writer_test() {
74+
let f = File::open(&Path::new("data/sample_1.xml")).unwrap();
75+
let mut r = EventReader::new(BufferedReader::new(f));
76+
let mut w = EventWriter::new(io::stdout());
77+
78+
for e in r.events() {
79+
match e.as_writer_event() {
80+
Some(e) => match w.write(e) {
81+
Ok(_) => {},
82+
Err(e) => println!("Writer error: {}", e)
83+
},
84+
None => println!("Non-writer event: {}", e)
85+
}
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)