diff options
author | Richard Jones <rjones@trick.home.annexia.org> | 2009-10-02 15:42:14 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-10-13 17:53:20 +0100 |
commit | d37f69795396ec2354eb2d8480d64b9e5bdafacc (patch) | |
tree | 0685bb56dd3032d4e413930f23f93aac323b4cd9 /ocaml/t | |
parent | c6b8db6493dd633bf48b13daf72cdc9c078b5f9a (diff) | |
download | libguestfs-d37f69795396ec2354eb2d8480d64b9e5bdafacc.tar.gz libguestfs-d37f69795396ec2354eb2d8480d64b9e5bdafacc.tar.xz libguestfs-d37f69795396ec2354eb2d8480d64b9e5bdafacc.zip |
inspector: Generate language bindings for OCaml.
This commit adds a generic mechanism for deriving language bindings
for virt-inspector, and implements one concrete binding, for OCaml.
The bindings are generated from the RELAX NG schema (virt-inspector.rng)
which is supposed to be a correct and always up to date description
of the XML that the virt-inspector program can generate.
From the RNG we generate a set of types to describe the output of
virt-inspector for the language, plus an XML parser, plus some
glue code to actually run an external instance of virt-inspector
and parse the resulting XML.
At runtime, an external 'virt-inspector --xml <name>' command runs
and the XML is parsed into language-specific structures.
This has been tested on the four example files (inspector/example?.xml)
The only particular difficulty about the OCaml binding is the use of
Obj.magic, which is naughty but works because of the isomorphism
between the representation of tuples and records in OCaml. This
seems to cause no problems in my test program. Apart from this, the
OCaml binding is straightforward and could be adapted easily for any
other languages that want type-safe virt-inspector bindings.
It's important to keep virt-inspector.rng up to date with changes
to virt-inspector's XML output format.
Diffstat (limited to 'ocaml/t')
-rw-r--r-- | ocaml/t/guestfs_500_inspect.ml | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/ocaml/t/guestfs_500_inspect.ml b/ocaml/t/guestfs_500_inspect.ml new file mode 100644 index 00000000..ec1071a9 --- /dev/null +++ b/ocaml/t/guestfs_500_inspect.ml @@ -0,0 +1,42 @@ +(* libguestfs OCaml bindings + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *) + +open Unix + +let (//) = Filename.concat +let dotdot = Filename.parent_dir_name + +let read_file name = + let chan = open_in name in + let lines = ref [] in + let lines = + try while true do lines := input_line chan :: !lines done; [] + with End_of_file -> List.rev !lines in + close_in chan; + String.concat "" lines + +let parse name = + let xml = read_file name in + let os = Guestfs_inspector.inspect ~xml [] in + os + +let () = + ignore (parse (dotdot // "inspector" // "example1.xml")); + ignore (parse (dotdot // "inspector" // "example2.xml")); + ignore (parse (dotdot // "inspector" // "example3.xml")); + ignore (parse (dotdot // "inspector" // "example4.xml")) |