| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package common |
| |
| import ( |
| "log" |
| "os" |
| "path" |
| "path/filepath" |
| ) |
| |
| // OutputWriterByFilePath returns |Writer| that writes to a file whose relative |
| // path from config.OutputDir() is equivalent to the relative path from |
| // config.SrcRootPath() to fileName. Also, the extension of the file is changed |
| // from ".mojom" to |ext|. |
| // |
| // e.g. If |
| // ext = ".d" |
| // fileName = /alpha/beta/gamma/file.mojom |
| // SrcRootPath = /alpha/ |
| // OutputDir = /some/output/path/ |
| // |
| // The writer writes to /some/output/path/beta/gamma/file.d |
| func OutputWriterByFilePath(fileName string, config GeneratorConfig, ext string) Writer { |
| fileName = changeExt(fileName, ext) |
| outPath := outputFileByFilePath(fileName, config) |
| |
| return createAndOpen(outPath) |
| } |
| |
| // outputFileByFilePath computes a file path such that the relative path |
| // from config.SrcRootPath() to the returned path is equivalent to the relative |
| // path from config.SrcRootPath() to fileName. |
| // |
| // e.g. If |
| // fileName = /alpha/beta/gamma/file.mojom |
| // SrcRootPath = /alpha/ |
| // OutputDir = /some/output/path/ |
| // |
| // The returned path is /some/output/path/beta/gamma/file.mojom |
| func outputFileByFilePath(fileName string, config GeneratorConfig) string { |
| var err error |
| relFileName, err := filepath.Rel(config.SrcRootPath(), fileName) |
| if err != nil { |
| log.Fatalln(err.Error()) |
| } |
| return filepath.Join(config.OutputDir(), relFileName) |
| } |
| |
| // createAndOpen opens for writing the specified file. If the file or any part |
| // of the directory structure in its path does not exist, they are created. |
| func createAndOpen(outPath string) (file Writer) { |
| // Create the directory that will contain the output. |
| outDir := path.Dir(outPath) |
| if err := os.MkdirAll(outDir, os.ModeDir|0777); err != nil && !os.IsExist(err) { |
| log.Fatalln(err.Error()) |
| } |
| |
| var err error |
| file, err = os.OpenFile(outPath, os.O_WRONLY|os.O_CREATE, 0666) |
| if err != nil { |
| log.Fatalln(err.Error()) |
| } |
| |
| return |
| } |
| |
| // changeExt changes the extension of a file to the specified extension. |
| func changeExt(fileName string, ext string) string { |
| return fileName[:len(fileName)-len(filepath.Ext(fileName))] + ext |
| } |