// Copyright 2024 The Fuchsia 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 bazel_docgen

import (
	pb "go.fuchsia.dev/fuchsia/tools/bazel-docgen/third_party/stardoc"
	"io"
	"text/template"
)

type MarkdownRenderer struct{}

func NewMarkdownRenderer() MarkdownRenderer {
	return MarkdownRenderer{}
}

func (r MarkdownRenderer) RenderRuleInfo(rule *pb.RuleInfo, out io.Writer) error {
	return render(rule, out, NewRuleTemplate)
}

func (r MarkdownRenderer) RenderProviderInfo(rule *pb.ProviderInfo, out io.Writer) error {
	return render(rule, out, NewProviderTemplate)
}

func (r MarkdownRenderer) RenderStarlarkFunctionInfo(rule *pb.StarlarkFunctionInfo, out io.Writer) error {
	return render(rule, out, NewStarlarkFunctionTemplate)
}

func (r MarkdownRenderer) RenderRepositoryRuleInfo(rule *pb.RepositoryRuleInfo, out io.Writer) error {
	return render(rule, out, NewRepositoryRuleTemplate)
}

func render(v interface{}, out io.Writer, templateFunc func() (*template.Template, error)) error {
	t, err := templateFunc()
	if err == nil {
		err = t.Execute(out, v)
	}
	return err
}
