// Copyright 2016 Google Inc. 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 fs

import (
	"regexp"

	"github.com/google/slothfs/manifest"
)

// CloneOption configures for which files we should trigger a git clone.
type CloneOption struct {
	RE    *regexp.Regexp
	Clone bool
}

// GitilesOptions configures the Gitiles filesystem.
type GitilesOptions struct {
	Revision string

	// If set, clone the repo on reads from here.
	CloneURL string

	// List of filename options. We use the first matching option
	CloneOption []CloneOption
}

// ManifestOptions holds options for a Manifest file system.
type ManifestOptions struct {
	Manifest *manifest.Manifest

	// RepoCloneOption matches against the Path field of the
	// repository within a manifest.
	RepoCloneOption []CloneOption
	FileCloneOption []CloneOption
}

// MultiFSOptions holds options for a file system with multiple manifests.
type MultiFSOptions struct {

	// RepoCloneOption matches against the Path field of the
	// repository within a manifest.
	RepoCloneOption []CloneOption
	FileCloneOption []CloneOption
}
