ballerina-platform / ballerina-library

The Ballerina Library
https://ballerina.io/learn/api-docs/ballerina/
Apache License 2.0
137 stars 58 forks source link

Invalid results for XMLs when using rest types with records in `data.xmldata` module. #6907

Open SasinduDilshara opened 1 month ago

SasinduDilshara commented 1 month ago
import ballerina/data.xmldata;
import ballerina/io;

xml x = xml `
    <A a="2">
        <name a="10">1</name>
        <name a="10">2</name>
    </A>
`;

xml x3= xml `
    <A a="2">
        <name a="10">a</name>
        <name a="10">2</name>
    </A>
`;

xml x2 = xml `
    <A a="2">
        <name b="10">1</name>
    </A>
`;

public function main() {
    record{|record{}...;|}|error c = xmldata:parseAsType(x);
    io:println(c); // current behaviour:- {"name":{"#content":2}} 
                   // Expected behaviour - error

    c = xmldata:parseAsType(x3);
    io:println(c); // current behaviour:- {"name":{"#content":2}}
                   // Expected behaviour - error

    record{|record{}[]...;|}|error d = xmldata:parseAsType(x);
    io:println(d); // current behaviour:- {"name":[{"#content":1},{"#content":2}]}
                   // Expected behaviour - {"name":[{"#content":1, a: 10},{"#content":2, a: 10}]}

    d = xmldata:parseAsType(x2);
    io:println(d); // current behaviour:- {"name":[{"#content":1}]}
                   // Expected behaviour - {"name":[{"#content":1, a: 10}]}

    d = xmldata:parseAsType(x3);
    io:println(d); // current behaviour:- {"name":[{"#content":"a"},{"#content":2}]}
                   // Expected behaviour - {"name":[{"#content":"a", a: 10},{"#content":2, a: 10}]}

    record{|int...;|}|error e = xmldata:parseAsType(x);
    io:println(e); // current behaviour:- error Error ("expected 'int' value for the field 'name' found 'array' value")
                   // Expected behaviour - {a: 2}

    e = xmldata:parseAsType(x2);
    io:println(e); // current behaviour:- {"name":{"b":10,"#content":1}}
                   // Expected behaviour - {a: 2}

    e = xmldata:parseAsType(x3);
    io:println(e); // current behaviour:- error Error ("'string' value 'a' cannot be converted to 'int'")
                   // Expected behaviour - {a: 2}
}