All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Victor Toso <victortoso@redhat.com>
Cc: qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
	John Snow <jsnow@redhat.com>
Subject: Re: [PATCH v1 3/9] qapi: golang: Generate qapi's struct types in Go
Date: Fri, 29 Sep 2023 14:33:08 +0100	[thread overview]
Message-ID: <ZRbSFJdaw+RMOdJf@redhat.com> (raw)
In-Reply-To: <vyefh5qpavk2kdgg6kyglvfryxbq6w2d422zr6bc5cklfaagyy@3hgytl2yl234>

On Fri, Sep 29, 2023 at 03:29:34PM +0200, Victor Toso wrote:
> Hi,
> 
> On Thu, Sep 28, 2023 at 03:06:23PM +0100, Daniel P. Berrangé wrote:
> > On Wed, Sep 27, 2023 at 01:25:38PM +0200, Victor Toso wrote:
> > > This patch handles QAPI struct types and generates the equivalent
> > > types in Go. The following patch adds extra logic when a member of the
> > > struct has a Type that can take JSON Null value (e.g: StrOrNull in
> > > QEMU)
> > > 
> > > The highlights of this implementation are:
> > > 
> > > 1. Generating an Go struct that requires a @base type, the @base type
> > >    fields are copied over to the Go struct. The advantage of this
> > >    approach is to not have embed structs in any of the QAPI types.
> > >    Note that embedding a @base type is recursive, that is, if the
> > >    @base type has a @base, all of those fields will be copied over.
> > > 
> > > 2. About the Go struct's fields:
> > > 
> > >    i) They can be either by Value or Reference.
> > > 
> > >   ii) Every field that is marked as optional in the QAPI specification
> > >       are translated to Reference fields in its Go structure. This
> > >       design decision is the most straightforward way to check if a
> > >       given field was set or not. Exception only for types that can
> > >       take JSON Null value.
> > > 
> > >  iii) Mandatory fields are always by Value with the exception of QAPI
> > >       arrays, which are handled by Reference (to a block of memory) by
> > >       Go.
> > > 
> > >   iv) All the fields are named with Uppercase due Golang's export
> > >       convention.
> > > 
> > >    v) In order to avoid any kind of issues when encoding or decoding,
> > >       to or from JSON, we mark all fields with its @name and, when it is
> > >       optional, member, with @omitempty
> > > 
> > > Example:
> > > 
> > > qapi:
> > >  | { 'struct': 'BlockdevCreateOptionsFile',
> > >  |   'data': { 'filename': 'str',
> > >  |             'size': 'size',
> > >  |             '*preallocation': 'PreallocMode',
> > >  |             '*nocow': 'bool',
> > >  |             '*extent-size-hint': 'size'} }
> > > 
> > > go:
> > > | type BlockdevCreateOptionsFile struct {
> > > |     Filename       string        `json:"filename"`
> > > |     Size           uint64        `json:"size"`
> > > |     Preallocation  *PreallocMode `json:"preallocation,omitempty"`
> > > |     Nocow          *bool         `json:"nocow,omitempty"`
> > > |     ExtentSizeHint *uint64       `json:"extent-size-hint,omitempty"`
> > > | }
> > 
> > Note, 'omitempty' shouldn't be used on pointer fields, only
> > scalar fields. The pointer fields are always omitted when nil.
> 
> 'omitempty' should be used with pointer fields unless you want to
> Marshal JSON Null, which is not the expected output.

Oh doh, did't notice that.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  reply	other threads:[~2023-09-29 13:33 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-27 11:25 [PATCH v1 0/9] qapi-go: add generator for Golang interface Victor Toso
2023-09-27 11:25 ` [PATCH v1 1/9] qapi: golang: Generate qapi's enum types in Go Victor Toso
2023-09-28 13:52   ` Daniel P. Berrangé
2023-09-28 14:20     ` Markus Armbruster
2023-09-28 14:34       ` Daniel P. Berrangé
2023-09-29 12:07     ` Victor Toso
2023-10-02 19:07   ` John Snow
2023-10-02 20:09     ` John Snow
2023-10-04 12:43       ` Victor Toso
2023-10-04 16:23         ` John Snow
2023-10-04 12:28     ` Victor Toso
2023-09-27 11:25 ` [PATCH v1 2/9] qapi: golang: Generate qapi's alternate " Victor Toso
2023-09-28 14:51   ` Daniel P. Berrangé
2023-09-29 12:23     ` Victor Toso
2023-09-29 12:37       ` Daniel P. Berrangé
2023-10-02 21:48         ` John Snow
2023-10-04 17:01           ` Victor Toso
2023-10-02 20:36   ` John Snow
2023-10-04 16:46     ` Victor Toso
2023-09-27 11:25 ` [PATCH v1 3/9] qapi: golang: Generate qapi's struct " Victor Toso
2023-09-28 14:06   ` Daniel P. Berrangé
2023-09-29 13:29     ` Victor Toso
2023-09-29 13:33       ` Daniel P. Berrangé [this message]
2023-09-27 11:25 ` [PATCH v1 4/9] qapi: golang: structs: Address 'null' members Victor Toso
2023-09-27 11:25 ` [PATCH v1 5/9] qapi: golang: Generate qapi's union types in Go Victor Toso
2023-09-28 14:21   ` Daniel P. Berrangé
2023-09-29 13:41     ` Victor Toso
2023-10-11 13:27       ` Victor Toso
2023-09-27 11:25 ` [PATCH v1 6/9] qapi: golang: Generate qapi's event " Victor Toso
2023-09-27 11:25 ` [PATCH v1 7/9] qapi: golang: Generate qapi's command " Victor Toso
2023-09-28 14:32   ` Daniel P. Berrangé
2023-09-29 13:53     ` Victor Toso
2023-10-14 14:26     ` Victor Toso
2023-09-27 11:25 ` [PATCH v1 8/9] qapi: golang: Add CommandResult type to Go Victor Toso
2023-09-28 15:03   ` Daniel P. Berrangé
2023-09-29 13:55     ` Victor Toso
2023-09-27 11:25 ` [PATCH v1 9/9] docs: add notes on Golang code generator Victor Toso
2023-09-28 13:22   ` Daniel P. Berrangé
2023-09-29 12:00     ` Victor Toso
2023-09-27 11:38 ` [PATCH v1 0/9] qapi-go: add generator for Golang interface Victor Toso
2023-09-28 13:40 ` Daniel P. Berrangé
2023-09-28 13:54   ` Daniel P. Berrangé
2023-09-29 14:08     ` Victor Toso
2023-09-29 14:17   ` Victor Toso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZRbSFJdaw+RMOdJf@redhat.com \
    --to=berrange@redhat.com \
    --cc=armbru@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=victortoso@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.