1 
  
   2 
  
   3 using System;
  
   4 
  
   5 public UniquePtr<System.Xml.Document> CreateDoc()
  
   6 {
  
   7     UniquePtr<System.Xml.Document> doc(System.Xml.MakeDocument());
  
   8     UniquePtr<System.Xml.Element> phs(System.Xml.MakeElement("philosophers"));
  
   9     UniquePtr<System.Xml.Element> ph1(System.Xml.MakeElement("philosopher"));
  
  10     ph1->SetAttribute("name", "Plato");
  
  11     phs->AppendChild(ph1.Release());
  
  12     UniquePtr<System.Xml.Element> ph2(System.Xml.MakeElement("philosopher"));
  
  13     ph2->SetAttribute("name", "Aristotle");
  
  14     phs->AppendChild(ph2.Release());
  
  15     UniquePtr<System.Xml.Element> ph3(System.Xml.MakeElement("philosopher"));
  
  16     ph3->SetAttribute("name", "Socrates");
  
  17     phs->AppendChild(ph3.Release());
  
  18     doc->AppendChild(phs.Release());
  
  19     return doc;
  
  20 }
  
  21 
  
  22 [nodiscard]
  
  23 public Result<bool> WriteDocToFile(System.Xml.Document* doc)
  
  24 {
  
  25     auto createResult = System.IO.File.CreateText("philosophers.xml");
  
  26     if (createResult.Error())
  
  27     {
  
  28         return Result<bool>(ErrorId(createResult.GetErrorId()));
  
  29     }
  
  30     System.IO.StreamWriter& writer = createResult.Value();
  
  31     System.Text.CodeFormatter formatter(writer);
  
  32     formatter.SetIndentSize(1);
  
  33     auto writeResult = doc->Write(formatter);
  
  34     if (writeResult.Error())
  
  35     {
  
  36         return writeResult;
  
  37     }
  
  38     return Result<bool>(true);
  
  39 }
  
  40 
  
  41 [nodiscard]
  
  42 public Result<UniquePtr<System.Xml.Document>> ReadDocFromFile(System.Lex.FileMap& fileMap)
  
  43 {
  
  44     auto result = System.Xml.ParseXmlDocument("philosophers.xml", fileMap);
  
  45     if (result.Error())
  
  46     {
  
  47         Result<UniquePtr<System.Xml.Document>>(ErrorId(result.GetErrorId()));
  
  48     }
  
  49     UniquePtr<System.Xml.Document> doc = Rvalue(result.Value());
  
  50     return Result<UniquePtr<System.Xml.Document>>(Rvalue(doc));
  
  51 }
  
  52 
  
  53 [nodiscard]
  
  54 public Result<bool> WriteDocToConsole(System.Xml.Document* doc)
  
  55 {
  
  56     System.Text.CodeFormatter formatter(Console.Out());
  
  57     formatter.SetIndentSize(4);
  
  58     auto result = doc->Write(formatter);
  
  59     if (result.Error())
  
  60     {
  
  61         return result;
  
  62     }
  
  63     return Result<bool>(true);
  
  64 }
  
  65 
  
  66 int main()
  
  67 {
  
  68     UniquePtr<System.Xml.Document> doc = CreateDoc();
  
  69     auto result = WriteDocToFile(doc.Get());
  
  70     if (result.Error())
  
  71     {
  
  72         Console.Error() << result.GetErrorMessage() << endl();
  
  73         return 1;
  
  74     }
  
  75     System.Lex.FileMap fileMap;
  
  76     Result<UniquePtr<System.Xml.Document>> readResult = ReadDocFromFile(fileMap);
  
  77     if (readResult.Error())
  
  78     {
  
  79         Console.Error() << readResult.GetErrorMessage() << endl();
  
  80         return 1;
  
  81     }
  
  82     System.Xml.Document* docRead = readResult.Value().Get();
  
  83     result = WriteDocToConsole(docRead);
  
  84     if (result.Error())
  
  85     {
  
  86         Console.Error() << result.GetErrorMessage() << endl();
  
  87         return 1;
  
  88     }
  
  89     return 0;
  
  90 }