diff options
author | Francois Perrad <francois.perrad@gadz.org> | 2010-10-25 18:55:14 +0200 |
---|---|---|
committer | Francois Perrad <francois.perrad@gadz.org> | 2010-10-25 18:55:14 +0200 |
commit | 582d5e76b9f29d62256756693abe0c79e09c8c87 (patch) | |
tree | e3995e09ddd769a50be6336dfcec72f41f4466d6 | |
parent | add an infrastructure (Makefile based) (diff) | |
download | api-description-582d5e76b9f29d62256756693abe0c79e09c8c87.tar.gz |
add a new tool
-rw-r--r-- | utils/spore2dot.pl | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/utils/spore2dot.pl b/utils/spore2dot.pl new file mode 100644 index 0000000..a49fffe --- /dev/null +++ b/utils/spore2dot.pl @@ -0,0 +1,87 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use JSON; +use IO::All; +use Pod::Usage; + +pod2usage(1) unless scalar(@ARGV) > 0; + +my @specs; +foreach (@ARGV) { + push @specs, read_from_json($_); +} + +print << 'DOT'; +digraph { + + node [shape=record]; + edge [arrowhead = odot, arrowtail = none]; +DOT + +my $has_interface = scalar(@specs) > 1; +if ($has_interface) { + my $top = $specs[0]->{name}; + print " \"", $top, "\"\n"; + print " [label=\"{\\N}\"];\n\n"; + foreach my $spec (@specs) { + my $name = $spec->{meta}->{module} || $spec->{name}; + print " \"", $top, "\" -> \"", $name, "\"\n\n"; + } + +} + +foreach my $spec (@specs) { + my $name = $spec->{meta}->{module} || $spec->{name}; + print " \"", $name, "\"\n"; + print " [label=\"{"; + print "«interface»\\n" if ($has_interface); + print "\\N|"; + for my $name (sort keys %{$spec->{methods}}) { + my $desc = $spec->{methods}->{$name}; + print $name, "("; + my $first = 1; + if ($desc->{required_payload}) { + print "payload"; + $first = 0; + } + for (@{$desc->{required_params}}) { + print ", " unless $first; + print $_; + $first = 0; + } + if ($desc->{optional_params}) { + print " " unless $first; + } + for (@{$desc->{optional_params}}) { + print "\\["; + print ", " unless $first; + print $_, "\\]"; + $first = 0; + } + print ")\\l"; + } + print "}\"];\n\n"; +} +print "}\n"; + +sub read_from_json { + my ($fname) = @_; + + my $content < io $fname; + return JSON::decode_json($content); +} + +__END__ + +=head1 NAME + +spore2dot + +=head1 SYNOPSIS + +spore2dot.pl api1.json [api2.json, ...] > api.dot + +=cut |