1use crate::{
3 attribute::{Attribute, AttributeValue, Prefix},
4 misc::{Misc, MiscState},
5 processing_instruction::ProcessingInstruction,
6 prolog::{
7 content_particle::ContentParticle,
8 declaration_content::{DeclarationContent, Mixed},
9 doctype::DocType,
10 external_id::ExternalID,
11 id::ID,
12 subset::{
13 entity::{
14 entity_declaration::{EntityDecl, EntityDeclaration},
15 entity_definition::EntityDefinition,
16 entity_value::EntityValue,
17 },
18 markup_declaration::MarkupDeclaration,
19 Subset,
20 },
21 textdecl::TextDecl,
22 xmldecl::{Standalone, XmlDecl},
23 },
24 reference::Reference,
25 Document, Name, Tag,
26};
27use std::fmt::{self, Formatter};
28
29fn fmt_indented(f: &mut String, indent: usize, s: &str) {
30 f.push_str(&" ".repeat(indent));
31 f.push_str(s);
32}
33impl fmt::Debug for Tag {
34 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
35 let mut s = String::new();
36 self.fmt_indented_tag(&mut s, 0);
37 write!(f, "{}", s)
38 }
39}
40impl Tag {
41 fn fmt_indented_tag(&self, f: &mut String, indent: usize) {
42 let Tag {
43 name,
44 attributes,
45 state,
46 } = self;
47
48 fmt_indented(f, indent, "Tag {\n");
49 fmt_indented(
50 f,
51 indent + 4,
52 &format!("name: \n{}\n", name.fmt_qualified_name(indent + 8)),
53 );
54 fmt_indented(f, indent + 4, "attributes: ");
55
56 match attributes {
57 Some(attrs) => {
58 let mut s = String::new();
59 for attr in attrs {
60 attr.fmt_indented_attribute(&mut s, indent + 8);
61 }
62 f.push_str(&format!("Some([\n{}", s));
63 fmt_indented(f, indent + 4, "]),\n");
64 }
65 None => f.push_str("None,\n"),
66 }
67
68 fmt_indented(f, indent + 4, &format!("state: {:?},\n", state));
69 fmt_indented(f, indent, "},\n");
70 }
71}
72
73impl fmt::Debug for Name {
74 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
75 write!(f, "{}", self.fmt_qualified_name(0))
76 }
77}
78
79impl Name {
80 fn fmt_qualified_name(&self, indent: usize) -> String {
81 let Name { prefix, local_part } = self;
82 let mut f = String::new();
83
84 fmt_indented(&mut f, indent, "Name {\n");
85
86 match prefix {
87 Some(p) => {
88 fmt_indented(&mut f, indent + 4, &format!("prefix: Some(\"{}\"),\n", p));
89 }
90 None => {
91 fmt_indented(&mut f, indent + 4, "prefix: None,\n");
92 }
93 }
94 fmt_indented(
95 &mut f,
96 indent + 4,
97 &format!("local_part: \"{}\",\n", local_part),
98 );
99 fmt_indented(&mut f, indent, "}");
100
101 f
102 }
103}
104
105impl fmt::Debug for MiscState {
106 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
107 let mut s = String::new();
108 self.fmt_indented_misc_state(&mut s, 0);
109 write!(f, "{}", s)
110 }
111}
112
113impl MiscState {
114 fn fmt_indented_misc_state(&self, f: &mut String, _indent: usize) {
115 match self {
116 MiscState::BeforeDoctype => {
117 f.push_str("BeforeDoctype");
118 }
119 MiscState::AfterDoctype => {
120 f.push_str("AfterDoctype");
121 }
122 }
123 }
124}
125
126impl fmt::Debug for Misc {
127 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
128 let mut s = String::new();
129 self.fmt_indented_misc(&mut s, 0);
130 write!(f, "{}", s)
131 }
132}
133
134impl Misc {
135 fn fmt_indented_misc(&self, f: &mut String, indent: usize) {
136 fmt_indented(f, indent, "Misc {\n");
137 fmt_indented(f, indent + 4, &format!("content: {:?}", self.content));
138 fmt_indented(f, indent + 4, &format!("state: {:?},\n", self.state));
139 fmt_indented(f, indent, "},\n");
140 }
141}
142
143impl fmt::Debug for Document {
144 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
145 let mut s = String::new();
146 self.fmt_indented_doc(&mut s, 0);
147 writeln!(f, "{}", s)
148 }
149}
150
151impl Document {
152 fn fmt_indented_doc(&self, f: &mut String, indent: usize) {
153 match self {
154 Document::Prolog {
155 xml_decl,
156 misc,
157 doc_type,
158 } => {
159 if xml_decl.is_some() || misc.is_some() || doc_type.is_some() {
160 fmt_indented(f, indent, "Prolog {\n");
161 if let Some(xml_decl) = xml_decl {
162 xml_decl.fmt_indented_xml_decl(f, indent + 4);
163 }
164
165 if let Some(misc_vec) = misc {
166 for misc in misc_vec {
167 misc.fmt_indented_misc(f, indent + 4);
168 }
169 }
170 if let Some(doc_type) = doc_type {
171 doc_type.fmt_indented_doc_type(f, indent + 4);
172 }
173 fmt_indented(f, indent, "},\n");
174 }
175 }
176 Document::Element(tag1, document, tag2) => {
177 fmt_indented(f, indent, "Document::Element(\n");
178 tag1.fmt_indented_tag(f, indent + 4);
179 document.fmt_indented_doc(f, indent + 4);
180 tag2.fmt_indented_tag(f, indent + 4);
181 fmt_indented(f, indent, "),\n");
182 }
183 Document::Content(content) => {
184 fmt_indented(
185 f,
186 indent,
187 &format!(
188 "Content(\"{}\"),\n",
189 content.clone().map_or("".to_string(), |c| c)
190 ),
191 );
192 }
193 Document::Nested(documents) => {
194 fmt_indented(f, indent, "Nested([\n");
195 for document in documents.iter() {
196 document.fmt_indented_doc(f, indent + 4);
197 }
198 fmt_indented(f, indent, "]),\n");
199 }
200 Document::Comment(comment) => {
201 fmt_indented(f, indent, &format!("Comment(\"{}\"),\n", comment));
202 }
203 Document::Empty => {
204 fmt_indented(f, indent, "Empty");
205 }
206 Document::EmptyTag(tag) => {
207 fmt_indented(f, indent, "EmptyTag(\n");
208 tag.fmt_indented_tag(f, indent + 4);
209 fmt_indented(f, indent, "),\n");
210 }
211
212 Document::ProcessingInstruction(ProcessingInstruction { target, data }) => {
213 fmt_indented(f, indent, "ProcessingInstruction {\n");
214 fmt_indented(f, indent + 4, &format!("target: \"{:?}\",\n", target));
215 fmt_indented(
216 f,
217 indent + 4,
218 &match data {
219 Some(c) => format!("data: \"{}\",\n", c),
220 None => "data: None,\n".to_string(),
221 },
222 );
223 fmt_indented(f, indent, "},\n");
224 }
225
226 Document::CDATA(cdata) => {
227 fmt_indented(f, indent, &format!("CDATA(\"{}\"),\n", cdata.clone()));
228 }
229 }
230 }
231}
232
233impl DeclarationContent {
234 fn fmt_indented_dec_content(&self, f: &mut String, indent: usize) {
235 match self {
236 DeclarationContent::Mixed(mixed) => {
237 fmt_indented(f, indent, " DeclarationContent::Mixed(\n");
238 mixed.fmt_indented_mixed(f, indent + 4);
239 fmt_indented(f, indent, "),\n");
240 }
241 DeclarationContent::Children(children) => {
242 fmt_indented(f, indent, " DeclarationContent::Children (\n");
243 let mut s = String::new();
244 children.fmt_indented_content_particle(&mut s, indent);
245 fmt_indented(f, indent, &format!("{}\n", s));
246 fmt_indented(f, indent, "),\n");
247 }
248 DeclarationContent::Empty => {
249 fmt_indented(f, indent, "DeclarationContent::Empty,\n");
250 }
251 DeclarationContent::Any => {
252 fmt_indented(f, indent, "DeclarationContent::Any,\n");
253 }
254 }
255 }
256}
257
258impl fmt::Debug for DeclarationContent {
259 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
260 let mut s = String::new();
261 self.fmt_indented_dec_content(&mut s, 0);
262 writeln!(f, "{}", s)
263 }
264}
265
266impl Mixed {
267 fn fmt_indented_mixed(&self, f: &mut String, indent: usize) {
268 match self {
269 Mixed::PCDATA => {
270 fmt_indented(f, indent, "PCDATA,\n");
271 }
272 Mixed::Names(names) => {
273 fmt_indented(f, indent, "Names([\n");
274 for name in names {
275 let formatted_name = name.fmt_qualified_name(indent + 4); f.push_str(&format!("{},\n", formatted_name));
277 }
278 fmt_indented(f, indent, "]),\n");
279 }
280 }
281 }
282}
283
284impl fmt::Debug for Mixed {
285 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
286 let mut s = String::new();
287 self.fmt_indented_mixed(&mut s, 0);
288 write!(f, "{}", s)
289 }
290}
291
292impl ContentParticle {
293 fn fmt_indented_content_particle(&self, f: &mut String, indent: usize) {
294 match self {
295 ContentParticle::Name(name, conditional_state) => {
296 fmt_indented(f, indent, "ContentParticle::Name {\n");
297 fmt_indented(f, indent + 4, "name: \n");
298 let formatted_name = name.fmt_qualified_name(indent + 8);
299 f.push_str(&formatted_name);
300 f.push('\n');
301 fmt_indented(
302 f,
303 indent + 4,
304 &format!("conditional_state: {:?},\n", conditional_state),
305 );
306 fmt_indented(f, indent, "},\n");
307 }
308 ContentParticle::Choice(particles, conditional_state) => {
309 fmt_indented(f, indent, "ContentParticle::Choice {\n");
310 fmt_indented(f, indent + 4, "particles: [\n");
311 for item in particles {
312 item.fmt_indented_content_particle(f, indent + 8);
313 }
314 fmt_indented(f, indent + 4, "],\n");
315 fmt_indented(
316 f,
317 indent + 4,
318 &format!("conditional_state: {:?},\n", conditional_state),
319 );
320 fmt_indented(f, indent, "},\n");
321 }
322 ContentParticle::Sequence(particles, conditional_state) => {
323 fmt_indented(f, 4, "ContentParticle::Sequence {\n");
324 fmt_indented(f, indent + 8, "particles: [\n");
325 for item in particles {
326 item.fmt_indented_content_particle(f, indent + 12);
327 }
328 fmt_indented(f, indent + 8, "],\n");
329 fmt_indented(
330 f,
331 indent + 4,
332 &format!("conditional_state: {:?},\n", conditional_state),
333 );
334 fmt_indented(f, indent + 4, "},\n");
335 }
336 }
337 }
338}
339
340impl fmt::Debug for Standalone {
341 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
342 match self {
343 Standalone::Yes => write!(f, "Yes"),
344 Standalone::No => write!(f, "No"),
345 }
346 }
347}
348impl TextDecl {
349 fn _fmt_indented_text_decl(&self, f: &mut String, indent: usize) {
350 fmt_indented(f, indent, "TextDecl {\n");
351 fmt_indented(f, indent + 4, &format!("version: {:?},\n", self.version));
352 fmt_indented(f, indent + 4, &format!("encoding: {:?},\n", self.encoding));
353 fmt_indented(f, indent, "},\n");
354 }
355}
356
357impl XmlDecl {
358 fn fmt_indented_xml_decl(&self, f: &mut String, indent: usize) {
359 fmt_indented(f, indent, "XmlDecl {\n");
360 fmt_indented(f, indent + 4, &format!("version: {:?},\n", self.version));
361 fmt_indented(f, indent + 4, &format!("encoding: {:?},\n", self.encoding));
362 fmt_indented(
363 f,
364 indent + 4,
365 &format!("standalone: {:?},\n", self.standalone),
366 );
367 fmt_indented(f, indent, "},\n");
368 }
369}
370
371impl std::fmt::Debug for DocType {
372 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
373 f.debug_struct("DocType")
374 .field("name", &self.name)
375 .field("external_id", &self.external_id)
376 .field("subset", &self.subset)
377 .finish()
378 }
379}
380
381impl DocType {
382 fn fmt_indented_doc_type(&self, f: &mut String, indent: usize) {
383 fmt_indented(f, indent, "DocType {\n");
384 fmt_indented(
385 f,
386 indent + 4,
387 &format!("name: \n{}\n", self.name.fmt_qualified_name(indent + 8)),
388 );
389 fmt_indented(
390 f,
391 indent + 4,
392 &format!("external_id: {:?},\n", self.external_id),
393 );
394 fmt_indented(f, indent + 4, "subset: Some([\n");
395 for element in self.subset.as_ref().unwrap_or(&Vec::new()).iter() {
396 element.fmt_subset(f, indent + 8);
397 }
398 fmt_indented(f, indent + 4, "]),\n");
399 fmt_indented(f, indent, "},\n");
400 }
401}
402impl ExternalID {
403 fn fmt_indented_external_id(&self, f: &mut String, indent: usize) {
404 match self {
405 ExternalID::System(system) => {
406 fmt_indented(f, indent, &format!("System({:?}),\n", system));
407 }
408 ExternalID::Public {
409 pubid,
410 system_identifier,
411 } => {
412 fmt_indented(f, indent, "Public {\n");
413 fmt_indented(f, indent + 4, &format!("pubid: {:?},\n", pubid));
414 fmt_indented(f, indent + 4, "system_identifier: ");
415 system_identifier.fmt_indented_external_id(f, indent + 8);
416 fmt_indented(f, indent, "},\n");
417 }
418 }
419 }
420}
421
422impl std::fmt::Debug for ID {
423 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
424 match self {
425 ID::ExternalID(external_id) => f.debug_tuple("ExternalID").field(&external_id).finish(),
426 ID::PublicID(pubid_literal) => f.debug_tuple("PublicID").field(&pubid_literal).finish(),
427 }
428 }
429}
430
431impl ID {
432 fn fmt_indented_id(&self, f: &mut String, indent: usize) {
433 match self {
434 ID::ExternalID(external_id) => {
435 fmt_indented(f, indent, "ExternalID {\n");
436 external_id.fmt_indented_external_id(f, indent + 4); fmt_indented(f, indent, "},\n");
438 }
439 ID::PublicID(pubid_literal) => {
440 fmt_indented(f, indent, &format!("PublicID({:?}),\n", pubid_literal));
441 }
442 }
443 }
444}
445
446impl fmt::Debug for Subset {
447 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
448 let mut s = String::new();
449 self.fmt_subset(&mut s, 0);
450 write!(f, "{}", s)
451 }
452}
453
454impl Subset {
455 fn fmt_subset(&self, f: &mut String, indent: usize) {
456 match self {
457 Subset::MarkupDecl(markup_declaration) => {
458 markup_declaration.fmt_markup_decl(f, indent);
459 }
460 Subset::DeclSep {
461 reference,
462 expansion,
463 } => {
464 fmt_indented(f, indent, "DeclSep {\n");
465 fmt_indented(f, indent + 4, &format!("reference: {:?},\n", reference));
466 fmt_indented(f, indent + 4, "expansion: ");
467 if let Some(inner) = expansion.as_deref() {
468 let mut s = String::new();
469 inner.fmt_subset(&mut s, indent + 8);
470 f.push_str(&format!("Some(\n{}\n", s));
471 fmt_indented(f, indent + 4, "),\n");
472 } else {
473 f.push_str("None,\n");
474 }
475 fmt_indented(f, indent, "},\n");
476 }
477 Subset::None => {
478 fmt_indented(f, indent, "None");
479 }
480 }
481 }
482}
483
484impl MarkupDeclaration {
485 fn fmt_markup_decl(&self, f: &mut String, indent: usize) {
486 match self {
487 MarkupDeclaration::Element { name, content_spec } => {
488 fmt_indented(f, indent, "MarkupDeclaration::Element {\n");
489 fmt_indented(
490 f,
491 indent + 4,
492 &format!("name: \n{}\n", name.fmt_qualified_name(indent + 8)),
493 );
494 fmt_indented(f, indent + 4, "content_spec: ");
495 match content_spec {
496 Some(spec) => {
497 let mut s = String::new();
498 spec.fmt_indented_dec_content(&mut s, indent + 8);
499 f.push_str(&format!("Some(\n{}\n", s));
500 fmt_indented(f, indent + 4, "),\n");
501 }
502 None => f.push_str("None,\n"),
503 }
504 fmt_indented(f, indent, "},\n");
505 }
506
507 MarkupDeclaration::AttList { name, att_defs } => {
508 fmt_indented(f, indent, "AttList {\n");
509 fmt_indented(
510 f,
511 indent + 4,
512 &format!("name: \n{}\n", name.fmt_qualified_name(indent + 8)),
513 );
514 fmt_indented(f, indent + 4, "att_defs: [\n");
515 if let Some(def) = att_defs {
516 for def_item in def.iter() {
517 def_item.fmt_indented_attribute(f, indent + 8);
518 }
519 }
520 fmt_indented(f, indent + 4, "],\n");
521 fmt_indented(f, indent, "},\n");
522 }
523 MarkupDeclaration::Notation { name, id } => {
524 fmt_indented(f, indent, "Notation {\n");
525 fmt_indented(
526 f,
527 indent + 4,
528 &format!("name: \n{}\n", name.fmt_qualified_name(indent + 8)),
529 );
530 fmt_indented(f, indent + 4, "id: ");
531
532 id.fmt_indented_id(f, indent + 8);
534
535 fmt_indented(f, indent, "},\n");
536 }
537
538 MarkupDeclaration::Entity(entity_declaration) => match entity_declaration {
539 EntityDecl::General(general_declaration) => {
540 fmt_indented(f, indent, "Entity::General {\n");
541 let mut s = String::new();
542 general_declaration.fmt_indented_entity_declaration(&mut s, indent + 4);
543 f.push_str(&format!("{}\n", s));
544 fmt_indented(f, indent, "},\n");
545 }
546 EntityDecl::Parameter(parameter_declaration) => {
547 fmt_indented(f, indent, "Entity::Parameter {\n");
548 fmt_indented(f, indent + 4, &format!("{parameter_declaration:?}\n"));
549 fmt_indented(f, indent, "},\n");
550 }
551 },
552
553 MarkupDeclaration::ProcessingInstruction(ProcessingInstruction { target, data }) => {
554 fmt_indented(f, indent, "ProcessingInstruction {\n");
555 fmt_indented(f, indent + 4, &format!("target: {:?},\n", target));
556 fmt_indented(f, indent + 4, &format!("data: {:?},\n", data));
557 fmt_indented(f, indent, "},\n");
558 }
559 MarkupDeclaration::Comment(comment) => {
560 fmt_indented(f, indent, "Comment(\n");
561 match comment {
562 Document::Comment(comment_str) => {
563 fmt_indented(f, indent + 4, &format!("{:?}\n", comment_str));
564 }
565 _ => {
566 fmt_indented(f, indent + 4, "Unsupported comment variant,\n");
567 }
568 }
569 fmt_indented(f, indent, "),\n");
570 }
571 }
572 }
573}
574
575impl fmt::Debug for MarkupDeclaration {
576 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
577 let mut s = String::new();
578 self.fmt_markup_decl(&mut s, 0);
579 write!(f, "{}", s)
580 }
581}
582
583impl std::fmt::Debug for XmlDecl {
584 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
585 f.debug_struct("XmlDecl")
586 .field("version", &self.version)
587 .field("encoding", &self.encoding)
588 .field("standalone", &self.standalone)
589 .finish()
590 }
591}
592impl std::fmt::Debug for TextDecl {
593 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
594 f.debug_struct("TextDecl")
595 .field("version", &self.version)
596 .field("encoding", &self.encoding)
597 .finish()
598 }
599}
600
601impl std::fmt::Debug for AttributeValue {
602 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
603 let mut debug_string = String::new();
604 self.fmt_indented_attribute_value(&mut debug_string, 4);
605 write!(f, "{}", debug_string)
606 }
607}
608
609impl AttributeValue {
610 fn fmt_indented_attribute_value(&self, f: &mut String, indent: usize) {
611 match self {
612 AttributeValue::Value(value) => {
613 fmt_indented(f, indent - 4, "Value(\n");
614 fmt_indented(f, indent, &format!("{:?}\n", value));
615 fmt_indented(f, indent - 4, "),\n");
616 }
617 AttributeValue::Values(values) => {
618 fmt_indented(f, indent - 4, "Values(\n");
619 for value in values {
620 value.fmt_indented_attribute_value(f, indent);
621 }
622 fmt_indented(f, indent - 4, "),\n");
623 }
624 AttributeValue::Reference(reference) => {
625 fmt_indented(f, indent, "Reference(\n");
626 fmt_indented(f, indent + 4, &format!("{:?},\n", reference));
627 fmt_indented(f, indent, "),\n");
628 }
629 AttributeValue::EmptyExternalReference => {
630 fmt_indented(f, indent, "EmptyExternalReference\n");
631 }
632 }
633 }
634}
635
636impl Attribute {
637 fn fmt_indented_attribute(&self, f: &mut String, indent: usize) {
638 match self {
639 Attribute::Definition {
640 name,
641 att_type,
642 default_decl,
643 source,
644 } => {
645 fmt_indented(f, indent, "Definition {\n");
646 fmt_indented(f, indent + 4, "name: \n");
647 let formatted_name = name.fmt_qualified_name(indent + 8);
648 f.push_str(&formatted_name);
649 f.push('\n');
650 fmt_indented(f, indent + 4, &format!("att_type: {:?},\n", att_type));
651 fmt_indented(
652 f,
653 indent + 4,
654 &format!("default_decl: {:?},\n", default_decl),
655 );
656 fmt_indented(f, indent + 4, &format!("source: {:?},\n", source));
657 fmt_indented(f, indent, "},\n");
658 }
659 Attribute::Reference(reference) => {
660 fmt_indented(f, indent, &format!("Reference: {:?},\n", reference));
661 }
662 Attribute::Required => {
663 fmt_indented(f, indent, "REQUIRED,\n");
664 }
665 Attribute::Implied => {
666 fmt_indented(f, indent, "IMPLIED,\n");
667 }
668 Attribute::Instance { name, value } => {
669 fmt_indented(f, indent, "Instance {\n");
670 fmt_indented(f, indent + 4, "name: \n");
671 let formatted_name = name.fmt_qualified_name(indent + 8);
672 f.push_str(&formatted_name);
673 f.push('\n');
674 fmt_indented(f, indent + 4, "value:\n");
675 value.fmt_indented_attribute_value(f, indent + 12);
676 fmt_indented(f, indent, "},\n");
677 }
678 Attribute::Namespace { prefix, uri } => {
679 fmt_indented(f, indent, "Namespace {\n");
680 fmt_indented(f, indent + 4, &format!("prefix: {:?},\n", prefix));
681 uri.fmt_indented_attribute_value(f, indent + 4);
682 fmt_indented(f, indent, "},\n");
683 }
684 }
685 }
686}
687
688impl fmt::Debug for Attribute {
689 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
690 let mut s = String::new();
691 self.fmt_indented_attribute(&mut s, 0);
692 write!(f, "{}", s)
693 }
694}
695
696impl fmt::Debug for Prefix {
697 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
698 match self {
699 Prefix::Default => write!(f, "Default"),
700 Prefix::Prefix(p) => write!(f, "Prefix({:?})", p),
701 }
702 }
703}
704
705impl fmt::Debug for Reference {
719 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
720 let mut s = String::new();
721 self.fmt_indented_reference(&mut s, 0);
722 write!(f, "{}", s)
723 }
724}
725
726impl Reference {
727 fn fmt_indented_reference(&self, f: &mut String, indent: usize) {
728 match self {
729 Reference::EntityRef(name) => {
730 fmt_indented(f, indent, "EntityRef {\n");
731 fmt_indented(f, indent + 4, "name:\n");
732 let name_str = name.fmt_qualified_name(indent + 10);
733 f.push_str(&name_str);
734 f.push('\n');
735 fmt_indented(f, indent, "},\n");
736 }
737 Reference::CharRef(value) => {
738 fmt_indented(f, indent, "CharRef {\n");
739 fmt_indented(f, indent + 4, &format!("value: {:?},\n", value));
740 fmt_indented(f, indent, "},\n");
741 }
742 }
743 }
744}
745
746impl fmt::Debug for EntityDeclaration {
747 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
748 let mut s = String::new();
749 self.fmt_indented_entity_declaration(&mut s, 0);
750 write!(f, "{}", s.trim_end())
751 }
752}
753
754impl EntityDeclaration {
755 fn fmt_indented_entity_declaration(&self, f: &mut String, indent: usize) {
756 fmt_indented(f, indent, "EntityDeclaration {\n");
757 fmt_indented(
758 f,
759 indent + 8,
760 &format!("name: \n{}\n", self.name.fmt_qualified_name(indent + 12)),
761 );
762 fmt_indented(f, indent + 4, "entity_def:\n");
763 let mut s = String::new();
764 self.entity_def
765 .fmt_indented_entity_definition(&mut s, indent + 8);
766 f.push_str(&s.to_string());
767 fmt_indented(f, indent + 4, "},");
768 }
769}
770
771impl std::fmt::Debug for EntityDefinition {
772 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
773 let mut s = String::new();
774 self.fmt_indented_entity_definition(&mut s, 0);
775 write!(f, "{}", s)
776 }
777}
778
779impl EntityDefinition {
780 fn fmt_indented_entity_definition(&self, f: &mut String, indent: usize) {
781 match self {
782 EntityDefinition::EntityValue(value) => {
783 fmt_indented(f, indent, "EntityDefinition::EntityValue(\n");
784 value.fmt_indented_entity_value(f, indent + 4);
785 fmt_indented(f, indent, ")\n");
786 }
787 EntityDefinition::External {
788 id,
789 n_data,
790 text_decl,
791 } => {
792 fmt_indented(f, indent, "EntityDefinition::External {\n");
793 fmt_indented(f, indent + 4, &format!("id: {:?},\n", id));
794 fmt_indented(f, indent + 4, &format!("n_data: {:?},\n", n_data));
795 fmt_indented(f, indent + 4, &format!("text_decl: {:?},\n", text_decl));
796 fmt_indented(f, indent, "},\n");
797 }
798 }
799 }
800}
801
802impl std::fmt::Debug for EntityValue {
803 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
804 let mut s = String::new();
805 self.fmt_indented_entity_value(&mut s, 0);
806 write!(f, "{}", s)
807 }
808}
809
810impl EntityValue {
811 fn fmt_indented_entity_value(&self, f: &mut String, indent: usize) {
812 match self {
813 EntityValue::Value(value) => {
814 fmt_indented(f, indent, "Value(\n");
815 fmt_indented(f, indent, &format!("{value:?}\n"));
816 fmt_indented(f, indent + 4, "),\n");
817 }
818 EntityValue::Reference(reference) => {
819 fmt_indented(f, indent, "Reference(\n");
820 fmt_indented(f, indent + 4, &format!("{reference:?},\n"));
821 fmt_indented(f, indent, "),\n");
822 }
823 EntityValue::ParameterReference(reference) => {
824 fmt_indented(f, indent, "PerameterReference(\n");
825 fmt_indented(f, indent + 4, &format!("{reference:?},\n"));
826 fmt_indented(f, indent, "),\n");
827 }
828 EntityValue::Document(document) => {
829 fmt_indented(f, indent, "Document(\n");
830 fmt_indented(f, indent + 4, &format!("{document:?}"));
831 fmt_indented(f, indent, ")");
832 }
833 EntityValue::MarkupDecl(subset) => {
834 fmt_indented(f, indent, "MarkupDecl(\n");
836 fmt_indented(f, indent + 4, &format!("{subset:?},\n"));
837 fmt_indented(f, indent, "),\n");
838 }
839 }
840 }
841}