// ListObjects - GET bucket (list objects) func (fs *fsDriver) ListObjects(bucket string, resources drivers.BucketResourcesMetadata) ([]drivers.ObjectMetadata, drivers.BucketResourcesMetadata, error) { p := bucketDir{} p.files = make(map[string]os.FileInfo) if drivers.IsValidBucket(bucket) == false { return []drivers.ObjectMetadata{}, resources, iodine.New(drivers.BucketNameInvalid{Bucket: bucket}, nil) } if resources.Prefix != "" && drivers.IsValidObjectName(resources.Prefix) == false { return []drivers.ObjectMetadata{}, resources, iodine.New(drivers.ObjectNameInvalid{Bucket: bucket, Object: resources.Prefix}, nil) } rootPrefix := filepath.Join(fs.root, bucket) // check bucket exists if _, err := os.Stat(rootPrefix); os.IsNotExist(err) { return []drivers.ObjectMetadata{}, resources, iodine.New(drivers.BucketNotFound{Bucket: bucket}, nil) } p.root = rootPrefix err := filepath.Walk(rootPrefix, p.getAllFiles) if err != nil { return []drivers.ObjectMetadata{}, resources, iodine.New(err, nil) } var metadataList []drivers.ObjectMetadata var metadata drivers.ObjectMetadata // Populate filtering mode resources.Mode = drivers.GetMode(resources) var fileNames []string for name := range p.files { fileNames = append(fileNames, name) } sort.Strings(fileNames) for _, name := range fileNames { if len(metadataList) >= resources.Maxkeys { resources.IsTruncated = true if resources.IsTruncated && resources.IsDelimiterSet() { resources.NextMarker = metadataList[len(metadataList)-1].Key } break } if name > resources.Marker { metadata, resources, err = fs.filterObjects(bucket, name, p.files[name], resources) if err != nil { return []drivers.ObjectMetadata{}, resources, iodine.New(err, nil) } if metadata.Bucket != "" { metadataList = append(metadataList, metadata) } } } sort.Sort(byObjectKey(metadataList)) return metadataList, resources, nil }