]> Dogcows Code - chaz/graphql-client/blobdiff - lib/GraphQL/Client/CLI.pm
Version 0.603
[chaz/graphql-client] / lib / GraphQL / Client / CLI.pm
index bb2ab030b89c70597d955e824e8b8406afa41f59..d28634cf17d26c364ac8b5be2bd842674b52412b 100644 (file)
@@ -4,13 +4,16 @@ package GraphQL::Client::CLI;
 use warnings;
 use strict;
 
-use Text::ParseWords;
+use Encode qw(decode);
 use Getopt::Long 2.39 qw(GetOptionsFromArray);
 use GraphQL::Client;
 use JSON::MaybeXS;
+use Text::ParseWords;
 use namespace::clean;
 
-our $VERSION = '0.602'; # VERSION
+our $VERSION = '0.603'; # VERSION
+
+my $JSON = JSON::MaybeXS->new(canonical => 1);
 
 sub _croak { require Carp; goto &Carp::croak }
 
@@ -67,6 +70,7 @@ sub main {
     if ($query eq '-') {
         print STDERR "Interactive mode engaged! Waiting for a query on <STDIN>...\n"
             if -t STDIN; ## no critic (InputOutput::ProhibitInteractiveTest)
+        binmode(STDIN, 'encoding(UTF-8)');
         $query = do { local $/; <STDIN> };
     }
 
@@ -80,6 +84,7 @@ sub main {
         *STDOUT = $out;
     }
 
+    binmode(STDOUT, 'encoding(UTF-8)');
     _print_data($data, $format);
 
     exit($unpack && $err ? 1 : 0);
@@ -91,6 +96,9 @@ sub _get_options {
 
     unshift @args, shellwords($ENV{GRAPHQL_CLIENT_OPTIONS} || '');
 
+    # assume UTF-8 args if non-ASCII
+    @args = map { decode('UTF-8', $_) } @args if grep { /\P{ASCII}/ } @args;
+
     my %options = (
         format  => 'json:pretty',
         unpack  => 0,
@@ -124,18 +132,29 @@ sub _get_options {
         die "Two or more --variable keys are incompatible.\n" if $@;
     }
     elsif ($options{variables}) {
-        $options{variables} = eval { JSON::MaybeXS->new->decode($options{variables}) };
+        $options{variables} = eval { $JSON->decode($options{variables}) };
         die "The --variables JSON does not parse.\n" if $@;
     }
 
     return \%options;
 }
 
+sub _stringify {
+    my ($item) = @_;
+    if (ref($item) eq 'ARRAY') {
+        my $first = @$item && $item->[0];
+        return join(',', @$item) if !ref($first);
+        return join(',', map { $JSON->encode($_) } @$item);
+    }
+    return $JSON->encode($item) if ref($item) eq 'HASH';
+    return $item;
+}
+
 sub _print_data {
     my ($data, $format) = @_;
     $format = lc($format || 'json:pretty');
     if ($format eq 'json' || $format eq 'json:pretty') {
-        my %opts = (allow_nonref => 1, canonical => 1, utf8 => 1);
+        my %opts = (allow_nonref => 1, canonical => 1);
         $opts{pretty} = 1 if $format eq 'json:pretty';
         print JSON::MaybeXS->new(%opts)->encode($data);
     }
@@ -160,12 +179,12 @@ sub _print_data {
                 if ($first && ref $first eq 'HASH') {
                     @columns = sort keys %$first;
                     $rows = [
-                        map { [@{$_}{@columns}] } @$val
+                        map { [map { _stringify($_) } @{$_}{@columns}] } @$val
                     ];
                 }
                 elsif ($first) {
                     @columns = keys %$unpacked;
-                    $rows = [map { [$_] } @$val];
+                    $rows = [map { [map { _stringify($_) } $_] } @$val];
                 }
             }
         }
@@ -309,7 +328,7 @@ GraphQL::Client::CLI - Implementation of the graphql CLI program
 
 =head1 VERSION
 
-version 0.602
+version 0.603
 
 =head1 DESCRIPTION
 
This page took 0.024122 seconds and 4 git commands to generate.