package internal

import (
	"fmt"
	"strings"

	"v2ray.com/core/common"
	"v2ray.com/core/common/serial"
)

type LogEntry interface {
	common.Releasable
	fmt.Stringer
}

type ErrorLog struct {
	Prefix string
	Values []interface{}
}

func (v *ErrorLog) Release() {
	for _, val := range v.Values {
		common.Release(val)
	}
}

func (v *ErrorLog) String() string {
	return v.Prefix + serial.Concat(v.Values...)
}

type AccessLog struct {
	From   interface{}
	To     interface{}
	Status string
	Reason interface{}
}

func (v *AccessLog) Release() {
	common.Release(v.From)
	common.Release(v.To)
	common.Release(v.Reason)
}

func (v *AccessLog) String() string {
	return strings.Join([]string{serial.ToString(v.From), v.Status, serial.ToString(v.To), serial.ToString(v.Reason)}, " ")
}