// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"fmt"
	"os"
	"strings"
)

// main_utils contains functions and type definitions that are used by the mojom
// tool commands and implement logic that is not specific to any one command.

// CommaSeparatedList holds the result of parsing a command-line flag that
// accepts a comma-separated list of strings. This type satisfies the flag.Value
// interface.
type CommaSeparatedList []string

func (l *CommaSeparatedList) String() string {
	return fmt.Sprintf("%v", *l)
}

func (l *CommaSeparatedList) Set(args string) error {
	for _, el := range strings.Split(args, ",") {
		*l = append(*l, el)
	}
	return nil
}

// RepeatedStringArg holds the result of parsing a string command-line argument
// that can be repeated. This type satisfies the flag.Value interface.
type RepeatedStringArg []string

func (r *RepeatedStringArg) String() string {
	return fmt.Sprintf("%v", *r)
}

func (r *RepeatedStringArg) Set(arg string) error {
	*r = append(*r, arg)
	return nil
}

// DirectoryList holds the result of parsing a command-line flag
// that accepts a comma-separated list of directory paths. This
// type satisfies the flag.Value interface.
type DirectoryList []string

func (dl *DirectoryList) String() string {
	return fmt.Sprintf("%v", *dl)
}

func (dl *DirectoryList) Set(args string) error {
	for _, name := range strings.Split(args, ",") {
		info, err := os.Stat(name)
		if err != nil {
			return err
		}
		if !info.IsDir() {
			return fmt.Errorf("%s is not a directory.", name)
		}
		*dl = append(*dl, name)
	}
	return nil
}
