Example #1
0
func (p *parser) readService(srv *ast.Service) *parseError {
	if err := p.readToken("service"); err != nil {
		return err
	}
	srv.Position = p.cur.astPosition()

	tok := p.next()
	if tok.err != nil {
		return tok.err
	}
	srv.Name = tok.value // TODO: validate

	if err := p.readToken("{"); err != nil {
		return err
	}

	// Parse methods
	for !p.done {
		tok := p.next()
		if tok.err != nil {
			return tok.err
		}
		switch tok.value {
		case "}":
			// end of service
			return nil
		case "rpc":
			// handled below
		default:
			return p.errorf(`got %q, want "rpc" or "}"`, tok.value)
		}

		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		mth := new(ast.Method)
		srv.Methods = append(srv.Methods, mth)
		mth.Position = tok.astPosition()
		mth.Name = tok.value // TODO: validate
		mth.Up = srv

		if err := p.readToken("("); err != nil {
			return err
		}

		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		mth.InTypeName = tok.value // TODO: validate
		if err := p.readToken(")"); err != nil {
			return err
		}
		if err := p.readToken("returns"); err != nil {
			return err
		}
		if err := p.readToken("("); err != nil {
			return err
		}
		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		mth.OutTypeName = tok.value // TODO: validate

		if err := p.readToken(")"); err != nil {
			return err
		}
		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		if tok.value == "{" {
			p.back()
			if err := p.readMethodOptions(mth); err != nil {
				return err
			}
		} else if tok.value != ";" {
			return p.errorf("unexpected %v while parsing Method", tok.value)
		}
	}

	return p.errorf("unexpected EOF while parsing service")
}