github.com/yaegashi/msgraph.go@v0.1.4/gen/metadata/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"flag"
     6  	"io"
     7  	"io/ioutil"
     8  	"log"
     9  	"net/http"
    10  	"os"
    11  )
    12  
    13  const Tab = 2
    14  
    15  const (
    16  	OpenTag = iota
    17  	CloseTag
    18  	Content
    19  )
    20  
    21  // XML dumb indentation routine
    22  func indent(b []byte) []byte {
    23  	o := &bytes.Buffer{}
    24  	t := OpenTag
    25  	i := 0
    26  	p := 0
    27  	for p < len(b) {
    28  		if rune(b[p]) == '<' {
    29  			if p+1 < len(b) && rune(b[p+1]) == '/' {
    30  				t = CloseTag
    31  				i -= Tab
    32  			} else {
    33  				t = OpenTag
    34  			}
    35  		} else {
    36  			t = Content
    37  		}
    38  		for x := 0; x < i; x++ {
    39  			o.WriteRune(' ')
    40  		}
    41  		if t == Content {
    42  			for p < len(b) {
    43  				if rune(b[p]) == '<' {
    44  					break
    45  				}
    46  				o.WriteByte(b[p])
    47  				p++
    48  			}
    49  		} else {
    50  			for c := true; c && p < len(b); p++ {
    51  				if rune(b[p]) == '>' {
    52  					c = false
    53  					if t == OpenTag && (rune(b[p-1]) != '/' && rune(b[p-1]) != '?') {
    54  						i += Tab
    55  					}
    56  				}
    57  				o.WriteByte(b[p])
    58  			}
    59  		}
    60  		o.WriteRune('\n')
    61  	}
    62  	return o.Bytes()
    63  }
    64  
    65  func main() {
    66  	data := struct {
    67  		Pretty  bool
    68  		BaseURL string
    69  		Out     string
    70  	}{}
    71  
    72  	flag.BoolVar(&data.Pretty, "pretty", false, "Pretty output")
    73  	flag.StringVar(&data.BaseURL, "baseURL", "https://graph.microsoft.com/v1.0", "Base URL")
    74  	flag.StringVar(&data.Out, "out", "metadata-v1.0.xml", "Output file name")
    75  	flag.Parse()
    76  
    77  	url := data.BaseURL + "/$metadata"
    78  	log.Printf("Downloading %s to %s", url, data.Out)
    79  
    80  	var err error
    81  	var outFile io.WriteCloser
    82  	if data.Out == "-" {
    83  		outFile = os.Stdout
    84  	} else {
    85  		outFile, err = os.OpenFile(data.Out, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0644)
    86  		if err != nil {
    87  			log.Printf("%s already exists, skipping", data.Out)
    88  			return
    89  		}
    90  	}
    91  	defer outFile.Close()
    92  
    93  	res, err := http.Get(url)
    94  	if err != nil {
    95  		log.Fatal(err)
    96  	}
    97  	if res.StatusCode != http.StatusOK {
    98  		log.Fatal(res.Status)
    99  	}
   100  	defer res.Body.Close()
   101  	b, err := ioutil.ReadAll(res.Body)
   102  	if err != nil {
   103  		log.Fatal(err)
   104  	}
   105  
   106  	if data.Pretty {
   107  		b = indent(b)
   108  	}
   109  
   110  	_, err = outFile.Write(b)
   111  	if err != nil {
   112  		log.Fatal(err)
   113  	}
   114  }