Xml in AngelScript

Here’s the translation of the XML example from Go to AngelScript, formatted in Markdown suitable for Hugo:

// AngelScript offers support for XML and XML-like formats 
// through third-party libraries like TinyXML or RapidXML.
// For this example, we'll use a hypothetical XML library.

import xml;

// Plant will be mapped to XML. We'll use attributes to specify
// how each field should be represented in XML.
class Plant {
    [XmlElement("plant")]
    string name;
    
    [XmlAttribute("id")]
    int id;
    
    [XmlElement("name")]
    string plantName;
    
    [XmlArray("origin")]
    array<string> origin;
    
    string ToString() const {
        return "Plant id=" + id + ", name=" + plantName + ", origin=" + origin.join(", ");
    }
}

void main() {
    Plant@ coffee = Plant();
    coffee.id = 27;
    coffee.plantName = "Coffee";
    coffee.origin = {"Ethiopia", "Brazil"};

    // Emit XML representing our plant
    string out = xml.MarshalIndent(coffee, " ", "  ");
    print(out);

    // To add a generic XML header to the output, prepend it explicitly
    print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + out);

    // Use Unmarshal to parse a string with XML into a data structure
    Plant@ p;
    if (!xml.Unmarshal(out, @p)) {
        print("Error: Unable to unmarshal XML");
    } else {
        print(p.ToString());
    }

    Plant@ tomato = Plant();
    tomato.id = 81;
    tomato.plantName = "Tomato";
    tomato.origin = {"Mexico", "California"};

    // The Nesting class demonstrates how to create nested XML structures
    class Nesting {
        [XmlElement("nesting")]
        string name;
        
        [XmlArray("parent>child>plant")]
        array<Plant@> plants;
    }

    Nesting@ nesting = Nesting();
    nesting.plants.insertLast(coffee);
    nesting.plants.insertLast(tomato);

    out = xml.MarshalIndent(nesting, " ", "  ");
    print(out);
}

This AngelScript code demonstrates XML handling similar to the original example. Here are some key points:

  1. We use a hypothetical XML library, as AngelScript doesn’t have a built-in XML package.

  2. Instead of struct tags, we use attributes like [XmlElement] and [XmlAttribute] to specify how fields should be represented in XML.

  3. The Plant class includes a ToString() method for easy printing.

  4. XML marshaling and unmarshaling are done using the hypothetical xml.MarshalIndent() and xml.Unmarshal() functions.

  5. The nested XML structure is achieved using the Nesting class with appropriate XML attributes.

  6. AngelScript uses @ for handles (similar to pointers), which we use when creating objects.

  7. Arrays in AngelScript are declared using array<T> syntax.

This code provides a conceptual translation of the XML handling capabilities, adapted to AngelScript’s syntax and conventions. Note that actual XML handling in AngelScript would depend on the specific XML library being used.