1// Copyright 2019 Unknwon 2// 3// Licensed under the Apache License, Version 2.0 (the "License"): you may 4// not use this file except in compliance with the License. You may obtain 5// a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12// License for the specific language governing permissions and limitations 13// under the License. 14 15package ini 16 17import ( 18 "bytes" 19 "fmt" 20 "io" 21 "io/ioutil" 22 "os" 23) 24 25var ( 26 _ dataSource = (*sourceFile)(nil) 27 _ dataSource = (*sourceData)(nil) 28 _ dataSource = (*sourceReadCloser)(nil) 29) 30 31// dataSource is an interface that returns object which can be read and closed. 32type dataSource interface { 33 ReadCloser() (io.ReadCloser, error) 34} 35 36// sourceFile represents an object that contains content on the local file system. 37type sourceFile struct { 38 name string 39} 40 41func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) { 42 return os.Open(s.name) 43} 44 45// sourceData represents an object that contains content in memory. 46type sourceData struct { 47 data []byte 48} 49 50func (s *sourceData) ReadCloser() (io.ReadCloser, error) { 51 return ioutil.NopCloser(bytes.NewReader(s.data)), nil 52} 53 54// sourceReadCloser represents an input stream with Close method. 55type sourceReadCloser struct { 56 reader io.ReadCloser 57} 58 59func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) { 60 return s.reader, nil 61} 62 63func parseDataSource(source interface{}) (dataSource, error) { 64 switch s := source.(type) { 65 case string: 66 return sourceFile{s}, nil 67 case []byte: 68 return &sourceData{s}, nil 69 case io.ReadCloser: 70 return &sourceReadCloser{s}, nil 71 case io.Reader: 72 return &sourceReadCloser{ioutil.NopCloser(s)}, nil 73 default: 74 return nil, fmt.Errorf("error parsing data source: unknown type %q", s) 75 } 76} 77