1 // =================================
 2 // Copyright (c) 2025 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 using System;
 7 
 8 namespace System.Xml
 9 {
10     [nodiscard]
11     public Result<bool> ParseXmlFile(const string& xmlFilePath, XmlContentHandler* contentHandler, System.Lex.FileMap& fileMap)
12     {
13         auto result = System.IO.File.ReadAllText(xmlFilePath);
14         if (result.Error())
15         {
16             return Result<bool>(ErrorId(result.GetErrorId()));
17         }
18         return ParseXmlContent(result.Value(), xmlFilePath, contentHandler, fileMap);
19     }
20 
21     [nodiscard]
22     public Result<bool> ParseXmlContent(const string& xmlContent, const string& systemId, XmlContentHandler* contentHandler, System.Lex.FileMap& fileMap)
23     {
24         auto utf32Result = ToUtf32(xmlContent);
25         if (utf32Result.Error())
26         {
27             return Result<bool>(ErrorId(utf32Result.GetErrorId()));
28         }
29         return ParseXmlContent(Rvalue(utf32Result.Value()), systemId, contentHandler, fileMap);
30     }
31 
32     [nodiscard]
33     public Result<bool> ParseXmlContent(ustring&& xmlContent, const string& systemId, XmlContentHandler* contentHandler, System.Lex.FileMap& fileMap)
34     {
35         System.Lex.TrivialLexer lexer(xmlContent.Chars(), xmlContent.Chars() + xmlContent.Length(), systemId);
36         int fileIndex = fileMap.MapFileName(systemId);
37         lexer.SetFileIndex(fileIndex);
38         XmlProcessor processor(lexer, contentHandler);
39         auto result = XmlParser<System.Lex.TrivialLexer>.Parse(lexer, &processor);
40         if (result.Error())
41         {
42             return Result<bool>(ErrorId(result.GetErrorId()));
43         }
44         fileMap.AddSourceFile(fileIndex, xmlContent, lexer.GetLineStartIndeces());
45         return Result<bool>(true);
46     }