@@ -70,6 +70,26 @@ func getMapValueString(m map[string]interface{}, key string) string {
70
70
}
71
71
return ""
72
72
}
73
+ func getDescription (raw interface {}) string {
74
+ var desc string
75
+
76
+ switch node := raw .(type ) {
77
+ case ast.DescribableNode :
78
+ if sval := node .GetDescription (); sval != nil {
79
+ desc = sval .Value
80
+ }
81
+ case map [string ]interface {}:
82
+ desc = getMapValueString (node , "Description.Value" )
83
+ }
84
+ if desc != "" {
85
+ sep := ""
86
+ if strings .ContainsRune (desc , '\n' ) {
87
+ sep = "\n "
88
+ }
89
+ desc = join ([]string {`"""` , desc , `"""` }, sep )
90
+ }
91
+ return desc
92
+ }
73
93
74
94
func toSliceString (slice interface {}) []string {
75
95
if slice == nil {
@@ -506,6 +526,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
506
526
fmt .Sprintf ("%v" , node .Name ),
507
527
join (directives , " " ),
508
528
}, " " )
529
+ if desc := getDescription (node ); desc != "" {
530
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
531
+ }
509
532
return visitor .ActionUpdate , str
510
533
case map [string ]interface {}:
511
534
name := getMapValueString (node , "Name" )
@@ -518,6 +541,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
518
541
name ,
519
542
join (directives , " " ),
520
543
}, " " )
544
+ if desc := getDescription (node ); desc != "" {
545
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
546
+ }
521
547
return visitor .ActionUpdate , str
522
548
}
523
549
return visitor .ActionNoChange , nil
@@ -539,6 +565,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
539
565
join (directives , " " ),
540
566
block (fields ),
541
567
}, " " )
568
+ if desc := getDescription (node ); desc != "" {
569
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
570
+ }
542
571
return visitor .ActionUpdate , str
543
572
case map [string ]interface {}:
544
573
name := getMapValueString (node , "Name" )
@@ -555,6 +584,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
555
584
join (directives , " " ),
556
585
block (fields ),
557
586
}, " " )
587
+ if desc := getDescription (node ); desc != "" {
588
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
589
+ }
558
590
return visitor .ActionUpdate , str
559
591
}
560
592
return visitor .ActionNoChange , nil
@@ -569,7 +601,23 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
569
601
for _ , directive := range node .Directives {
570
602
directives = append (directives , fmt .Sprintf ("%v" , directive .Name ))
571
603
}
572
- str := name + wrap ("(" , join (args , ", " ), ")" ) + ": " + ttype + wrap (" " , join (directives , " " ), "" )
604
+ hasArgDesc := false
605
+ for _ , arg := range node .Arguments {
606
+ if arg .Description != nil && arg .Description .Value != "" {
607
+ hasArgDesc = true
608
+ break
609
+ }
610
+ }
611
+ var argsStr string
612
+ if hasArgDesc {
613
+ argsStr = wrap ("(" , indent ("\n " + join (args , "\n " )), "\n )" )
614
+ } else {
615
+ argsStr = wrap ("(" , join (args , ", " ), ")" )
616
+ }
617
+ str := name + argsStr + ": " + ttype + wrap (" " , join (directives , " " ), "" )
618
+ if desc := getDescription (node ); desc != "" {
619
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
620
+ }
573
621
return visitor .ActionUpdate , str
574
622
case map [string ]interface {}:
575
623
name := getMapValueString (node , "Name" )
@@ -579,7 +627,23 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
579
627
for _ , directive := range getMapSliceValue (node , "Directives" ) {
580
628
directives = append (directives , fmt .Sprintf ("%v" , directive ))
581
629
}
582
- str := name + wrap ("(" , join (args , ", " ), ")" ) + ": " + ttype + wrap (" " , join (directives , " " ), "" )
630
+ hasArgDesc := false
631
+ for _ , arg := range args {
632
+ if strings .HasPrefix (strings .TrimSpace (arg ), `"""` ) {
633
+ hasArgDesc = true
634
+ break
635
+ }
636
+ }
637
+ var argsStr string
638
+ if hasArgDesc {
639
+ argsStr = wrap ("(" , indent ("\n " + join (args , "\n " )), "\n )" )
640
+ } else {
641
+ argsStr = wrap ("(" , join (args , ", " ), ")" )
642
+ }
643
+ str := name + argsStr + ": " + ttype + wrap (" " , join (directives , " " ), "" )
644
+ if desc := getDescription (node ); desc != "" {
645
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
646
+ }
583
647
return visitor .ActionUpdate , str
584
648
}
585
649
return visitor .ActionNoChange , nil
@@ -599,7 +663,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
599
663
wrap ("= " , defaultValue , "" ),
600
664
join (directives , " " ),
601
665
}, " " )
602
-
666
+ if desc := getDescription (node ); desc != "" {
667
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
668
+ }
603
669
return visitor .ActionUpdate , str
604
670
case map [string ]interface {}:
605
671
name := getMapValueString (node , "Name" )
@@ -614,6 +680,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
614
680
wrap ("= " , defaultValue , "" ),
615
681
join (directives , " " ),
616
682
}, " " )
683
+ if desc := getDescription (node ); desc != "" {
684
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
685
+ }
617
686
return visitor .ActionUpdate , str
618
687
}
619
688
return visitor .ActionNoChange , nil
@@ -633,6 +702,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
633
702
join (directives , " " ),
634
703
block (fields ),
635
704
}, " " )
705
+ if desc := getDescription (node ); desc != "" {
706
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
707
+ }
636
708
return visitor .ActionUpdate , str
637
709
case map [string ]interface {}:
638
710
name := getMapValueString (node , "Name" )
@@ -647,6 +719,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
647
719
join (directives , " " ),
648
720
block (fields ),
649
721
}, " " )
722
+ if desc := getDescription (node ); desc != "" {
723
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
724
+ }
650
725
return visitor .ActionUpdate , str
651
726
}
652
727
return visitor .ActionNoChange , nil
@@ -666,6 +741,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
666
741
join (directives , " " ),
667
742
"= " + join (types , " | " ),
668
743
}, " " )
744
+ if desc := getDescription (node ); desc != "" {
745
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
746
+ }
669
747
return visitor .ActionUpdate , str
670
748
case map [string ]interface {}:
671
749
name := getMapValueString (node , "Name" )
@@ -680,6 +758,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
680
758
join (directives , " " ),
681
759
"= " + join (types , " | " ),
682
760
}, " " )
761
+ if desc := getDescription (node ); desc != "" {
762
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
763
+ }
683
764
return visitor .ActionUpdate , str
684
765
}
685
766
return visitor .ActionNoChange , nil
@@ -699,6 +780,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
699
780
join (directives , " " ),
700
781
block (values ),
701
782
}, " " )
783
+ if desc := getDescription (node ); desc != "" {
784
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
785
+ }
702
786
return visitor .ActionUpdate , str
703
787
case map [string ]interface {}:
704
788
name := getMapValueString (node , "Name" )
@@ -713,6 +797,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
713
797
join (directives , " " ),
714
798
block (values ),
715
799
}, " " )
800
+ if desc := getDescription (node ); desc != "" {
801
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
802
+ }
716
803
return visitor .ActionUpdate , str
717
804
}
718
805
return visitor .ActionNoChange , nil
@@ -729,6 +816,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
729
816
name ,
730
817
join (directives , " " ),
731
818
}, " " )
819
+ if desc := getDescription (node ); desc != "" {
820
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
821
+ }
732
822
return visitor .ActionUpdate , str
733
823
case map [string ]interface {}:
734
824
name := getMapValueString (node , "Name" )
@@ -740,6 +830,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
740
830
name ,
741
831
join (directives , " " ),
742
832
}, " " )
833
+ if desc := getDescription (node ); desc != "" {
834
+ str = fmt .Sprintf ("\n %s\n %s" , desc , str )
835
+ }
743
836
return visitor .ActionUpdate , str
744
837
}
745
838
return visitor .ActionNoChange , nil
@@ -759,6 +852,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
759
852
join (directives , " " ),
760
853
block (fields ),
761
854
}, " " )
855
+ if desc := getDescription (node ); desc != "" {
856
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
857
+ }
762
858
return visitor .ActionUpdate , str
763
859
case map [string ]interface {}:
764
860
name := getMapValueString (node , "Name" )
@@ -773,6 +869,9 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
773
869
join (directives , " " ),
774
870
block (fields ),
775
871
}, " " )
872
+ if desc := getDescription (node ); desc != "" {
873
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
874
+ }
776
875
return visitor .ActionUpdate , str
777
876
}
778
877
return visitor .ActionNoChange , nil
@@ -793,15 +892,46 @@ var printDocASTReducer = map[string]visitor.VisitFunc{
793
892
"DirectiveDefinition" : func (p visitor.VisitFuncParams ) (string , interface {}) {
794
893
switch node := p .Node .(type ) {
795
894
case * ast.DirectiveDefinition :
796
- args := wrap ("(" , join (toSliceString (node .Arguments ), ", " ), ")" )
797
- str := fmt .Sprintf ("directive @%v%v on %v" , node .Name , args , join (toSliceString (node .Locations ), " | " ))
895
+ args := toSliceString (node .Arguments )
896
+ hasArgDesc := false
897
+ for _ , arg := range node .Arguments {
898
+ if arg .Description != nil && arg .Description .Value != "" {
899
+ hasArgDesc = true
900
+ break
901
+ }
902
+ }
903
+ var argsStr string
904
+ if hasArgDesc {
905
+ argsStr = wrap ("(" , indent ("\n " + join (args , "\n " )), "\n )" )
906
+ } else {
907
+ argsStr = wrap ("(" , join (args , ", " ), ")" )
908
+ }
909
+ str := fmt .Sprintf ("directive @%v%v on %v" , node .Name , argsStr , join (toSliceString (node .Locations ), " | " ))
910
+ if desc := getDescription (node ); desc != "" {
911
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
912
+ }
798
913
return visitor .ActionUpdate , str
799
914
case map [string ]interface {}:
800
915
name := getMapValueString (node , "Name" )
801
916
locations := toSliceString (getMapValue (node , "Locations" ))
802
917
args := toSliceString (getMapValue (node , "Arguments" ))
803
- argsStr := wrap ("(" , join (args , ", " ), ")" )
918
+ hasArgDesc := false
919
+ for _ , arg := range args {
920
+ if strings .HasPrefix (strings .TrimSpace (arg ), `"""` ) {
921
+ hasArgDesc = true
922
+ break
923
+ }
924
+ }
925
+ var argsStr string
926
+ if hasArgDesc {
927
+ argsStr = wrap ("(" , indent ("\n " + join (args , "\n " )), "\n )" )
928
+ } else {
929
+ argsStr = wrap ("(" , join (args , ", " ), ")" )
930
+ }
804
931
str := fmt .Sprintf ("directive @%v%v on %v" , name , argsStr , join (locations , " | " ))
932
+ if desc := getDescription (node ); desc != "" {
933
+ str = fmt .Sprintf ("%s\n %s" , desc , str )
934
+ }
805
935
return visitor .ActionUpdate , str
806
936
}
807
937
return visitor .ActionNoChange , nil
0 commit comments