125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // 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) | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | ` |