package taskfile

import (
	"bufio"
	"context"
	"fmt"
	"os"
)

// A StdinNode is a node that reads a taskfile from the standard input stream.
type StdinNode struct {
	*BaseNode
	Dir string
}

func NewStdinNode(dir string) (*StdinNode, error) {
	base := NewBaseNode()
	return &StdinNode{
		BaseNode: base,
		Dir:      dir,
	}, nil
}

func (node *StdinNode) Location() string {
	return "__stdin__"
}

func (node *StdinNode) Remote() bool {
	return false
}

func (node *StdinNode) Read(ctx context.Context) ([]byte, error) {
	var stdin []byte
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		stdin = fmt.Appendln(stdin, scanner.Text())
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}
	return stdin, nil
}

func (node *StdinNode) BaseDir() string {
	return node.Dir
}