| // Copyright 2018 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package res |
| |
| import ( |
| "errors" |
| "fmt" |
| "path" |
| "strings" |
| ) |
| |
| // ErrNotResPath the provided path does not seem to point to a resource file |
| var ErrNotResPath = errors.New("Not a resource path") |
| |
| // ErrSkipResPath the provided path does needs to be skipped. |
| var ErrSkipResPath = errors.New("resource path that does needs to be skipped") |
| |
| // PathInfo contains all information about a resource that can be derived from its location on the filesystem. |
| type PathInfo struct { |
| Path string |
| ResDir string |
| TypeDir string |
| Type Type |
| Qualifier string |
| Density Density |
| } |
| |
| // ParsePath converts a path string into a PathInfo object if the string points to a resource file. |
| func ParsePath(p string) (PathInfo, error) { |
| parent := path.Dir(p) |
| resDir := path.Dir(parent) |
| typeDir := path.Base(parent) |
| |
| if strings.HasPrefix(path.Base(p), ".") { |
| return PathInfo{}, ErrSkipResPath |
| } |
| |
| resType, err := ParseValueOrType(strings.Split(typeDir, "-")[0]) |
| qualifier := extractQualifier(typeDir) |
| if err != nil { |
| return PathInfo{}, ErrNotResPath |
| } |
| var density Density |
| for _, q := range strings.Split(qualifier, "-") { |
| var err error |
| density, err = ParseDensity(q) |
| if err != nil { |
| return PathInfo{}, err |
| } |
| if density != UnspecifiedDensity { |
| break |
| } |
| } |
| return PathInfo{ |
| Path: p, |
| ResDir: resDir, |
| TypeDir: typeDir, |
| Type: resType, |
| Qualifier: qualifier, |
| Density: density, |
| }, nil |
| } |
| |
| // MakePathInfo converts a path string into a PathInfo object. |
| func MakePathInfo(p string) (*PathInfo, error) { |
| pi, err := ParsePath(p) |
| if err != nil { |
| return nil, fmt.Errorf("ParsePath failed to parse %q: %v", p, err) |
| } |
| return &pi, nil |
| } |
| |
| // MakePathInfos converts a list of path strings into a list of PathInfo objects. |
| func MakePathInfos(paths []string) ([]*PathInfo, error) { |
| pis := make([]*PathInfo, 0, len(paths)) |
| for _, p := range paths { |
| if strings.HasPrefix(path.Base(p), ".") { |
| continue |
| } |
| pi, err := MakePathInfo(p) |
| if err != nil { |
| return nil, err |
| } |
| pis = append(pis, pi) |
| } |
| return pis, nil |
| } |
| |
| func extractQualifier(s string) string { |
| base := path.Base(s) |
| parts := strings.SplitN(base, "-", 2) |
| if len(parts) > 1 { |
| return parts[1] |
| } |
| return "" |
| } |