<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText">>> ... how about value and size constraints too?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">>Would the notation for expressing such constraints be Turing-equivalent, or do you envision something less ambitious?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I think sticking to something less ambitious would be the most productive, and would mirror what other systems do. Not even the complexitophiles in the ITU did that with ASN.1. Trying to invent a Turing complete constraints language
 is likely to lead to the use of the acronym “YACL”, which I fear would do no good.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">>How about interdependencies between arguments?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Again I think simplicity would be most productive. <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Whenever I’ve found myself having interdependencies between message fields in, say, ASN.1 or GPB – the equivalent of your question - I’ve often found that that’s an indication that I’m not constructing a very good schema. If the value of
 a message field changes the meaning or range of another, to me that is a cue to dispose of that first field and replace it with an ASN.1 CHOICE or a GPB oneof. Each value of that first field becomes a version of the CHOICE / oneof containing the other message
 fields as required. For example,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Foo ::= SEQUENCE OF<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">   a INTEGER (0..1), --- Value controls what b can be<o:p></o:p></p>
<p class="MsoNormal">   b INTEGER             --- if a is 0, valid from 0 to 10, otherwise 0 to 100<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Becomes<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Foo ::= SEQUENCE OF<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">   a CHOICE<o:p></o:p></p>
<p class="MsoNormal">   {<o:p></o:p></p>
<p class="MsoNormal">      b_firstver INTEGER (0..10)<o:p></o:p></p>
<p class="MsoNormal">      b_secondver INTEGER (0..100)<o:p></o:p></p>
<p class="MsoNormal">   }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In generated code this might turn into a union in C, or a class in C# that has a nullable members for b_firstver and b_secondver, plus an enum a for a saying which b should be set.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Looking over the DBus wire format there’s no UNION (there is a STRUCT). I think it would get messy to replicate an ASN.1 CHOICE / GPB oneof in DBus wire format. Changing the wire format to make it possible sounds like a bad way to go –
 it would break a lot of things. I guess the best equivalent in DBus would be to split it out the options into separate methods accepting the different flavours of B:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><method name=”ProcessFooVersion1”><o:p></o:p></p>
<p class="MsoNormal"><arg name=”b_firstver” type=”i” direction=”in” minval=0 maxval=10/><o:p></o:p></p>
<p class="MsoNormal"></method><o:p></o:p></p>
<p class="MsoNormal"><method name=”ProcessFooVersion2”><o:p></o:p></p>
<p class="MsoNormal"><arg name=”b_secondtver” type=”i” direction=”in” minval=0 maxval=100/><o:p></o:p></p>
<p class="MsoNormal"></method><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I acknowledge that this approach can quickly become impractical with interdependencies even only a little more complex than this! But it doesn’t require anything else to be added to the syntax of the introspection XML (not even my suggested
 constraints).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">So I think for simplicity’s sake it’s best not to try having a way of expressing interdependency.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>