package tagparser

import (
	
)

type Tag struct {
	Name    string
	Options map[string]string
}

func ( Tag) ( string) bool {
	,  := .Options[]
	return 
}

func ( string) Tag {
	 := parser{
		s: ,
	}
	.parse()
	return .tag
}

type parser struct {
	s string
	i int

	tag      Tag
	seenName bool // for empty names
}

func ( *parser) ( string) {
	if .seenName {
		.addOption(, "")
	} else {
		.seenName = true
		.tag.Name = 
	}
}

func ( *parser) (,  string) {
	.seenName = true
	if  == "" {
		return
	}
	if .tag.Options == nil {
		.tag.Options = make(map[string]string)
	}
	.tag.Options[] = 
}

func ( *parser) () {
	for .valid() {
		.parseKeyValue()
		if .peek() == ',' {
			.i++
		}
	}
}

func ( *parser) () {
	 := .i

	for .valid() {
		switch  := .read();  {
		case ',':
			 := .s[ : .i-1]
			.setName()
			return
		case ':':
			 := .s[ : .i-1]
			 := .parseValue()
			.addOption(, )
			return
		case '"':
			 := .parseQuotedValue()
			.setName()
			return
		}
	}

	 := .s[:.i]
	.setName()
}

func ( *parser) () string {
	 := .i

	for .valid() {
		switch  := .read();  {
		case '"':
			return .parseQuotedValue()
		case ',':
			return .s[ : .i-1]
		}
	}

	if .i ==  {
		return ""
	}
	return .s[:.i]
}

func ( *parser) () string {
	if  := strings.IndexByte(.s[.i:], '"');  >= 0 && .s[.i+-1] != '\\' {
		 := .s[.i : .i+]
		.i +=  + 1
		return 
	}

	 := make([]byte, 0, 16)

	for .valid() {
		switch  := .read();  {
		case '\\':
			 = append(, .read())
		case '"':
			return string()
		default:
			 = append(, )
		}
	}

	return ""
}

func ( *parser) () bool {
	return .i < len(.s)
}

func ( *parser) () byte {
	if !.valid() {
		return 0
	}
	 := .s[.i]
	.i++
	return 
}

func ( *parser) () byte {
	if !.valid() {
		return 0
	}
	 := .s[.i]
	return 
}