package packinterop import ( "archive/zip" "errors" ) type zipReaderFile struct { NameInternal string *zip.File } func (f zipReaderFile) Name() string { return f.NameInternal } type zipPackSource struct { MetaFile *zip.File Reader *zip.Reader cachedFileList []ImportPackFile } func (s zipPackSource) GetFile(path string) (ImportPackFile, error) { if s.cachedFileList == nil { s.cachedFileList = make([]ImportPackFile, len(s.Reader.File)) for i, v := range s.Reader.File { s.cachedFileList[i] = zipReaderFile{v.Name, v} } } for _, v := range s.cachedFileList { if v.Name() == path { return v, nil } } return zipReaderFile{}, errors.New("file not found in zip") } func (s zipPackSource) GetFileList() ([]ImportPackFile, error) { if s.cachedFileList == nil { s.cachedFileList = make([]ImportPackFile, len(s.Reader.File)) for i, v := range s.Reader.File { s.cachedFileList[i] = zipReaderFile{v.Name, v} } } return s.cachedFileList, nil } func (s zipPackSource) GetPackFile() ImportPackFile { return zipReaderFile{s.MetaFile.Name, s.MetaFile} } func GetZipPackSource(metaFile *zip.File, reader *zip.Reader) ImportPackSource { return zipPackSource{ MetaFile: metaFile, Reader: reader, } }