aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/swarm/mimegen/generator.go
blob: 68f9e306e5ac4077c090b2653d4de5ec05cd496c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Copyright 2018 The go-ethereum Authors
// This file is part of go-ethereum.
//
// go-ethereum is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// go-ethereum is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
package main

// Standard "mime" package rely on system-settings, see mime.osInitMime
// Swarm will run on many OS/Platform/Docker and must behave similar
// This command generates code to add common mime types based on mime.types file
//
// mime.types file provided by mailcap, which follow https://www.iana.org/assignments/media-types/media-types.xhtml
//
// Get last version of mime.types file by:
// docker run --rm -v $(pwd):/tmp alpine:edge /bin/sh -c "apk add -U mailcap; mv /etc/mime.types /tmp"

import (
    "bufio"
    "bytes"
    "flag"
    "html/template"
    "io/ioutil"
    "strings"

    "log"
)

var (
    typesFlag   = flag.String("types", "", "Input mime.types file")
    packageFlag = flag.String("package", "", "Golang package in output file")
    outFlag     = flag.String("out", "", "Output file name for the generated mime types")
)

type mime struct {
    Name string
    Exts []string
}

type templateParams struct {
    PackageName string
    Mimes       []mime
}

func main() {
    // Parse and ensure all needed inputs are specified
    flag.Parse()
    if *typesFlag == "" {
        log.Fatalf("--types is required")
    }
    if *packageFlag == "" {
        log.Fatalf("--types is required")
    }
    if *outFlag == "" {
        log.Fatalf("--out is required")
    }

    params := templateParams{
        PackageName: *packageFlag,
    }

    types, err := ioutil.ReadFile(*typesFlag)
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(bytes.NewReader(types))
    for scanner.Scan() {
        txt := scanner.Text()
        if strings.HasPrefix(txt, "#") || len(txt) == 0 {
            continue
        }
        parts := strings.Fields(txt)
        if len(parts) == 1 {
            continue
        }
        params.Mimes = append(params.Mimes, mime{parts[0], parts[1:]})
    }

    if err = scanner.Err(); err != nil {
        log.Fatal(err)
    }

    result := bytes.NewBuffer([]byte{})

    if err := template.Must(template.New("_").Parse(tpl)).Execute(result, params); err != nil {
        log.Fatal(err)
    }

    if err := ioutil.WriteFile(*outFlag, result.Bytes(), 0600); err != nil {
        log.Fatal(err)
    }
}

var tpl = `// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT.

package {{ .PackageName }}

import "mime"
func init() {
    var mimeTypes = map[string]string{
{{- range .Mimes -}}
    {{ $name := .Name -}}
    {{- range .Exts }}
        ".{{ . }}": "{{ $name | html }}",
    {{- end }}
{{- end }}
    }
    for ext, name := range mimeTypes {
        if err := mime.AddExtensionType(ext, name); err != nil {
            panic(err)
        }
    }
}
`