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 }