mirror of https://github.com/ethereum/go-ethereum
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.1 KiB
125 lines
3.1 KiB
6 years ago
|
// 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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`
|