package encoder

import (
	
	

	
)

func takeIndentSrcRuntimeContext( []byte) (*RuntimeContext, []byte) {
	 := TakeRuntimeContext()
	 := .Buf[:0]
	 = append(append(, ...), nul)
	.Buf = 
	return , 
}

func ( *bytes.Buffer,  []byte, ,  string) error {
	if len() == 0 {
		return errors.ErrUnexpectedEndOfJSON("", 0)
	}

	,  := takeIndentSrcRuntimeContext()
	 := TakeRuntimeContext()
	 := .Buf[:0]

	,  := indentAndWrite(, , , , )
	if  != nil {
		ReleaseRuntimeContext()
		ReleaseRuntimeContext()
		return 
	}
	.Buf = 
	ReleaseRuntimeContext()
	ReleaseRuntimeContext()
	return nil
}

func indentAndWrite( *bytes.Buffer,  []byte,  []byte, ,  string) ([]byte, error) {
	,  := doIndent(, , , , false)
	if  != nil {
		return nil, 
	}
	if ,  := .Write();  != nil {
		return nil, 
	}
	return , nil
}

func doIndent(,  []byte, ,  string,  bool) ([]byte, error) {
	, ,  := indentValue(, , 0, 0, []byte(), []byte(), )
	if  != nil {
		return nil, 
	}
	if  := validateEndBuf(, );  != nil {
		return nil, 
	}
	return , nil
}

func indentValue(
	 []byte,
	 []byte,
	 int,
	 int64,
	 []byte,
	 []byte,
	 bool) ([]byte, int64, error) {
	for {
		switch [] {
		case ' ', '\t', '\n', '\r':
			++
			continue
		case '{':
			return indentObject(, , , , , , )
		case '}':
			return nil, 0, errors.ErrSyntax("unexpected character '}'", )
		case '[':
			return indentArray(, , , , , , )
		case ']':
			return nil, 0, errors.ErrSyntax("unexpected character ']'", )
		case '"':
			return compactString(, , , )
		case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
			return compactNumber(, , )
		case 't':
			return compactTrue(, , )
		case 'f':
			return compactFalse(, , )
		case 'n':
			return compactNull(, , )
		default:
			return nil, 0, errors.ErrSyntax(fmt.Sprintf("unexpected character '%c'", []), )
		}
	}
}

func indentObject(
	 []byte,
	 []byte,
	 int,
	 int64,
	 []byte,
	 []byte,
	 bool) ([]byte, int64, error) {
	if [] == '{' {
		 = append(, '{')
	} else {
		return nil, 0, errors.ErrExpected("expected { character for object value", )
	}
	 = skipWhiteSpace(, +1)
	if [] == '}' {
		 = append(, '}')
		return ,  + 1, nil
	}
	++
	var  error
	for {
		 = append(append(, '\n'), ...)
		for  := 0;  < ; ++ {
			 = append(, ...)
		}
		 = skipWhiteSpace(, )
		, ,  = compactString(, , , )
		if  != nil {
			return nil, 0, 
		}
		 = skipWhiteSpace(, )
		if [] != ':' {
			return nil, 0, errors.ErrSyntax(
				fmt.Sprintf("invalid character '%c' after object key", []),
				+1,
			)
		}
		 = append(, ':', ' ')
		, ,  = indentValue(, , , +1, , , )
		if  != nil {
			return nil, 0, 
		}
		 = skipWhiteSpace(, )
		switch [] {
		case '}':
			 = append(append(, '\n'), ...)
			for  := 0;  < -1; ++ {
				 = append(, ...)
			}
			 = append(, '}')
			++
			return , , nil
		case ',':
			 = append(, ',')
		default:
			return nil, 0, errors.ErrSyntax(
				fmt.Sprintf("invalid character '%c' after object key:value pair", []),
				+1,
			)
		}
		++
	}
}

func indentArray(
	 []byte,
	 []byte,
	 int,
	 int64,
	 []byte,
	 []byte,
	 bool) ([]byte, int64, error) {
	if [] == '[' {
		 = append(, '[')
	} else {
		return nil, 0, errors.ErrExpected("expected [ character for array value", )
	}
	 = skipWhiteSpace(, +1)
	if [] == ']' {
		 = append(, ']')
		return ,  + 1, nil
	}
	++
	var  error
	for {
		 = append(append(, '\n'), ...)
		for  := 0;  < ; ++ {
			 = append(, ...)
		}
		, ,  = indentValue(, , , , , , )
		if  != nil {
			return nil, 0, 
		}
		 = skipWhiteSpace(, )
		switch [] {
		case ']':
			 = append(append(, '\n'), ...)
			for  := 0;  < -1; ++ {
				 = append(, ...)
			}
			 = append(, ']')
			++
			return , , nil
		case ',':
			 = append(, ',')
		default:
			return nil, 0, errors.ErrSyntax(
				fmt.Sprintf("invalid character '%c' after array value", []),
				+1,
			)
		}
		++
	}
}