You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/01/04 14:53:10 UTC
[dubbo-go] 01/01: fix duplicate error
This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit f11f1f90f1d42c406152bd222c0dbc7557035d2f
Author: AlexStocks <al...@foxmail.com>
AuthorDate: Mon Jan 4 18:08:16 2021 +0800
fix duplicate error
---
.github/workflows/github-actions.yml | 14 +++++++-------
cluster/router/chain/chain_test.go | 6 +++---
common/rpc_service.go | 6 +++---
config/config_loader_test.go | 9 ++++++---
config/service_config.go | 3 ++-
config_center/apollo/impl.go | 4 ++--
protocol/dubbo/dubbo_codec.go | 2 +-
protocol/dubbo/hessian2/hessian_dubbo.go | 6 +++---
protocol/dubbo/hessian2/hessian_request.go | 12 +++++-------
protocol/grpc/protoc-gen-dubbo/main.go | 2 +-
protocol/jsonrpc/http.go | 2 +-
registry/zookeeper/registry.go | 15 +++++++++------
registry/zookeeper/service_discovery_test.go | 8 ++------
remoting/getty/dubbo_codec_for_test.go | 2 +-
remoting/getty/listener.go | 6 +++---
remoting/getty/pool.go | 22 +++++++++++-----------
remoting/zookeeper/client.go | 18 +++++++++---------
remoting/zookeeper/client_test.go | 8 ++++----
remoting/zookeeper/listener.go | 14 ++++++++------
19 files changed, 81 insertions(+), 78 deletions(-)
diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml
index 48a3feb..64672af 100644
--- a/.github/workflows/github-actions.yml
+++ b/.github/workflows/github-actions.yml
@@ -53,7 +53,13 @@ jobs:
else
go get -v -t -d ./...
fi
-
+
+ - name: Install go ci lint
+ run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.27.0
+
+ - name: Run Linter
+ run: golangci-lint run --timeout=10m -v
+
- name: Verify
run: |
make verify
@@ -61,12 +67,6 @@ jobs:
- name: Integrate Test
run: |
chmod +x integrate_test.sh && ./integrate_test.sh
-
- - name: Install go ci lint
- run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.27.0
-
- - name: Run Linter
- run: golangci-lint run --timeout=10m -v
- name: Post Coverage
run: bash <(curl -s https://codecov.io/bash)
diff --git a/cluster/router/chain/chain_test.go b/cluster/router/chain/chain_test.go
index a2b5642..1bb7124 100644
--- a/cluster/router/chain/chain_test.go
+++ b/cluster/router/chain/chain_test.go
@@ -131,7 +131,7 @@ conditions:
_, err = z.Conn.Set(path, []byte(testyml), 0)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.NoError(t, err)
z.Close()
}()
@@ -209,7 +209,7 @@ conditions:
_, err = z.Conn.Set(path, []byte(testyml), 0)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.NoError(t, err)
z.Close()
}()
@@ -240,7 +240,7 @@ func TestRouterChainRouteNoRoute(t *testing.T) {
ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second)
assert.Nil(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.NoError(t, err)
z.Close()
}()
diff --git a/common/rpc_service.go b/common/rpc_service.go
index 9f587f3..30d72c1 100644
--- a/common/rpc_service.go
+++ b/common/rpc_service.go
@@ -106,10 +106,10 @@ func (m *MethodType) ReplyType() reflect.Type {
return m.replyType
}
-// SuiteContext tranfers @ctx to reflect.Value type or get it from @m.ctxType.
+// SuiteContext transfers @ctx to reflect.Value type or get it from @m.ctxType.
func (m *MethodType) SuiteContext(ctx context.Context) reflect.Value {
- if contextv := reflect.ValueOf(ctx); contextv.IsValid() {
- return contextv
+ if ctxV := reflect.ValueOf(ctx); ctxV.IsValid() {
+ return ctxV
}
return reflect.Zero(m.ctxType)
}
diff --git a/config/config_loader_test.go b/config/config_loader_test.go
index ef76bc0..f229054 100644
--- a/config/config_loader_test.go
+++ b/config/config_loader_test.go
@@ -104,7 +104,8 @@ func TestLoad(t *testing.T) {
conServices = map[string]common.RPCService{}
proServices = map[string]common.RPCService{}
- err := common.ServiceMap.UnRegister("com.MockService", "mock", common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
+ err := common.ServiceMap.UnRegister("com.MockService", "mock",
+ common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
assert.Nil(t, err)
consumerConfig = nil
providerConfig = nil
@@ -143,7 +144,8 @@ func TestLoadWithSingleReg(t *testing.T) {
conServices = map[string]common.RPCService{}
proServices = map[string]common.RPCService{}
- err := common.ServiceMap.UnRegister("com.MockService", "mock", common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
+ err := common.ServiceMap.UnRegister("com.MockService", "mock",
+ common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
assert.Nil(t, err)
consumerConfig = nil
providerConfig = nil
@@ -183,7 +185,8 @@ func TestWithNoRegLoad(t *testing.T) {
conServices = map[string]common.RPCService{}
proServices = map[string]common.RPCService{}
- err := common.ServiceMap.UnRegister("com.MockService", "mock", common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
+ err := common.ServiceMap.UnRegister("com.MockService", "mock",
+ common.ServiceKey("com.MockService", "huadong_idc", "1.0.0"))
assert.Nil(t, err)
consumerConfig = nil
providerConfig = nil
diff --git a/config/service_config.go b/config/service_config.go
index 8bc1b91..fd49390 100644
--- a/config/service_config.go
+++ b/config/service_config.go
@@ -176,7 +176,8 @@ func (c *ServiceConfig) Export() error {
// registry the service reflect
methods, err := common.ServiceMap.Register(c.InterfaceName, proto.Name, c.Group, c.Version, c.rpcService)
if err != nil {
- formatErr := perrors.Errorf("The service %v export the protocol %v error! Error message is %v.", c.InterfaceName, proto.Name, err.Error())
+ formatErr := perrors.Errorf("The service %v export the protocol %v error! Error message is %v.",
+ c.InterfaceName, proto.Name, err.Error())
logger.Errorf(formatErr.Error())
return formatErr
}
diff --git a/config_center/apollo/impl.go b/config_center/apollo/impl.go
index cb0f03d..5b74f5e 100644
--- a/config_center/apollo/impl.go
+++ b/config_center/apollo/impl.go
@@ -146,8 +146,8 @@ func (c *apolloConfiguration) getAddressWithProtocolPrefix(url *common.URL) stri
address := url.Location
converted := address
if len(address) != 0 {
- address := regexp.MustCompile(`\s+`).ReplaceAllString(address, "")
- parts := strings.Split(address, ",")
+ addr := regexp.MustCompile(`\s+`).ReplaceAllString(address, "")
+ parts := strings.Split(addr, ",")
addrs := make([]string, 0)
for _, part := range parts {
addr := part
diff --git a/protocol/dubbo/dubbo_codec.go b/protocol/dubbo/dubbo_codec.go
index f92da4a..21376c3 100644
--- a/protocol/dubbo/dubbo_codec.go
+++ b/protocol/dubbo/dubbo_codec.go
@@ -105,7 +105,7 @@ func (c *DubboCodec) EncodeRequest(request *remoting.Request) (*bytes.Buffer, er
return pkg.Marshal()
}
-// encode heartbeart request
+// encode heartbeat request
func (c *DubboCodec) encodeHeartbeartReqeust(request *remoting.Request) (*bytes.Buffer, error) {
header := impl.DubboHeader{
Type: impl.PackageHeartbeat,
diff --git a/protocol/dubbo/hessian2/hessian_dubbo.go b/protocol/dubbo/hessian2/hessian_dubbo.go
index 55a824a..5ffebde 100644
--- a/protocol/dubbo/hessian2/hessian_dubbo.go
+++ b/protocol/dubbo/hessian2/hessian_dubbo.go
@@ -190,9 +190,9 @@ func (h *HessianCodec) ReadBody(rspObj interface{}) error {
switch h.pkgType & PackageType_BitSize {
case PackageResponse | PackageHeartbeat | PackageResponse_Exception, PackageResponse | PackageResponse_Exception:
decoder := hessian.NewDecoder(buf[:])
- exception, err := decoder.Decode()
- if err != nil {
- return perrors.WithStack(err)
+ exception, exceptionErr := decoder.Decode()
+ if exceptionErr != nil {
+ return perrors.WithStack(exceptionErr)
}
rsp, ok := rspObj.(*DubboResponse)
if !ok {
diff --git a/protocol/dubbo/hessian2/hessian_request.go b/protocol/dubbo/hessian2/hessian_request.go
index efcbd95..94aa34d 100644
--- a/protocol/dubbo/hessian2/hessian_request.go
+++ b/protocol/dubbo/hessian2/hessian_request.go
@@ -220,23 +220,21 @@ func packRequest(service Service, header DubboHeader, req interface{}) ([]byte,
// body
//////////////////////////////////////////
if hb {
- if err := encoder.Encode(nil); err != nil {
- logger.Warnf("Encode(nil) = error: %v", err)
- }
+ _ = encoder.Encode(nil)
goto END
}
// dubbo version + path + version + method
- if err := encoder.Encode(DEFAULT_DUBBO_PROTOCOL_VERSION); err != nil {
+ if err = encoder.Encode(DEFAULT_DUBBO_PROTOCOL_VERSION); err != nil {
logger.Warnf("Encode(DEFAULT_DUBBO_PROTOCOL_VERSION) = error: %v", err)
}
- if err := encoder.Encode(service.Path); err != nil {
+ if err = encoder.Encode(service.Path); err != nil {
logger.Warnf("Encode(service.Path) = error: %v", err)
}
- if err := encoder.Encode(service.Version); err != nil {
+ if err = encoder.Encode(service.Version); err != nil {
logger.Warnf("Encode(service.Version) = error: %v", err)
}
- if err := encoder.Encode(service.Method); err != nil {
+ if err = encoder.Encode(service.Method); err != nil {
logger.Warnf("Encode(service.Method) = error: %v", err)
}
diff --git a/protocol/grpc/protoc-gen-dubbo/main.go b/protocol/grpc/protoc-gen-dubbo/main.go
index fbcfa6f..fe3e38d 100644
--- a/protocol/grpc/protoc-gen-dubbo/main.go
+++ b/protocol/grpc/protoc-gen-dubbo/main.go
@@ -43,7 +43,7 @@ func main() {
g.Error(err, "reading input")
}
- if err := proto.Unmarshal(data, g.Request); err != nil {
+ if err = proto.Unmarshal(data, g.Request); err != nil {
g.Error(err, "parsing input proto")
}
diff --git a/protocol/jsonrpc/http.go b/protocol/jsonrpc/http.go
index 037744c..11051df 100644
--- a/protocol/jsonrpc/http.go
+++ b/protocol/jsonrpc/http.go
@@ -189,7 +189,7 @@ func (c *HTTPClient) Do(addr, path string, httpHeader http.Header, body []byte)
return conn.SetDeadline(t)
}
- if err := setNetConnTimeout(tcpConn, c.options.HTTPTimeout); err != nil {
+ if err = setNetConnTimeout(tcpConn, c.options.HTTPTimeout); err != nil {
return nil, err
}
diff --git a/registry/zookeeper/registry.go b/registry/zookeeper/registry.go
index 8b61e80..3232ee6 100644
--- a/registry/zookeeper/registry.go
+++ b/registry/zookeeper/registry.go
@@ -251,8 +251,7 @@ func (r *zkRegistry) getListener(conf *common.URL) (*RegistryConfigurationListen
dataListener.mutex.Lock()
defer dataListener.mutex.Unlock()
if r.dataListener.subscribed[conf.ServiceKey()] != nil {
-
- zkListener, _ := r.dataListener.subscribed[conf.ServiceKey()].(*RegistryConfigurationListener)
+ zkListener, _ = r.dataListener.subscribed[conf.ServiceKey()].(*RegistryConfigurationListener)
if zkListener != nil {
r.listenerLock.Lock()
defer r.listenerLock.Unlock()
@@ -284,7 +283,11 @@ func (r *zkRegistry) getListener(conf *common.URL) (*RegistryConfigurationListen
//Interested register to dataconfig.
r.dataListener.SubscribeURL(conf, zkListener)
- go r.listener.ListenServiceEvent(conf, fmt.Sprintf("/dubbo/%s/"+constant.DEFAULT_CATEGORY, url.QueryEscape(conf.Service())), r.dataListener)
+ go r.listener.ListenServiceEvent(
+ conf,
+ fmt.Sprintf("/dubbo/%s/"+constant.DEFAULT_CATEGORY, url.QueryEscape(conf.Service())),
+ r.dataListener,
+ )
return zkListener, nil
}
@@ -295,9 +298,9 @@ func (r *zkRegistry) getCloseListener(conf *common.URL) (*RegistryConfigurationL
r.dataListener.mutex.Lock()
configurationListener := r.dataListener.subscribed[conf.ServiceKey()]
if configurationListener != nil {
- zkListener, _ := configurationListener.(*RegistryConfigurationListener)
- if zkListener != nil {
- if zkListener.isClosed {
+ rcListener, _ := configurationListener.(*RegistryConfigurationListener)
+ if rcListener != nil {
+ if rcListener.isClosed {
r.dataListener.mutex.Unlock()
return nil, perrors.New("configListener already been closed")
}
diff --git a/registry/zookeeper/service_discovery_test.go b/registry/zookeeper/service_discovery_test.go
index b7d4677..c9e14af 100644
--- a/registry/zookeeper/service_discovery_test.go
+++ b/registry/zookeeper/service_discovery_test.go
@@ -81,8 +81,7 @@ func TestCURDZookeeperServiceDiscovery(t *testing.T) {
sd, err := newZookeeperServiceDiscovery(testName)
assert.Nil(t, err)
defer func() {
- err := sd.Destroy()
- assert.Nil(t, err)
+ _ = sd.Destroy()
}()
md := make(map[string]string)
md["t1"] = "test1"
@@ -151,8 +150,7 @@ func TestAddListenerZookeeperServiceDiscovery(t *testing.T) {
sd, err := newZookeeperServiceDiscovery(testName)
assert.Nil(t, err)
defer func() {
- err := sd.Destroy()
- assert.Nil(t, err)
+ _ = sd.Destroy()
}()
err = sd.Register(®istry.DefaultServiceInstance{
@@ -165,8 +163,6 @@ func TestAddListenerZookeeperServiceDiscovery(t *testing.T) {
Metadata: nil,
})
assert.Nil(t, err)
-
- assert.Nil(t, err)
wg := &sync.WaitGroup{}
wg.Add(1)
tn := &testNotify{
diff --git a/remoting/getty/dubbo_codec_for_test.go b/remoting/getty/dubbo_codec_for_test.go
index be6d9db..9afc18a 100644
--- a/remoting/getty/dubbo_codec_for_test.go
+++ b/remoting/getty/dubbo_codec_for_test.go
@@ -99,7 +99,7 @@ func (c *DubboTestCodec) EncodeRequest(request *remoting.Request) (*bytes.Buffer
return pkg.Marshal()
}
-// encode heartbeart request
+// encode heartbeat request
func (c *DubboTestCodec) encodeHeartbeartReqeust(request *remoting.Request) (*bytes.Buffer, error) {
header := impl.DubboHeader{
Type: impl.PackageHeartbeat,
diff --git a/remoting/getty/listener.go b/remoting/getty/listener.go
index f402411..fd4c489 100644
--- a/remoting/getty/listener.go
+++ b/remoting/getty/listener.go
@@ -237,8 +237,8 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
}
h.rwlock.Unlock()
- decodeResult, ok := pkg.(remoting.DecodeResult)
- if !ok {
+ decodeResult, drOK := pkg.(remoting.DecodeResult)
+ if !drOK {
logger.Errorf("illegal package{%#v}", pkg)
return
}
@@ -252,7 +252,7 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
res.Handle()
return
}
- logger.Errorf("illegal package but not heartbeart. {%#v}", pkg)
+ logger.Errorf("illegal package but not heartbeat. {%#v}", pkg)
return
}
req := decodeResult.Result.(*remoting.Request)
diff --git a/remoting/getty/pool.go b/remoting/getty/pool.go
index 63c9c1a..2d1a2fe 100644
--- a/remoting/getty/pool.go
+++ b/remoting/getty/pool.go
@@ -270,25 +270,25 @@ func (c *gettyRPCClient) updateSession(session getty.Session) {
func (c *gettyRPCClient) getClientRpcSession(session getty.Session) (rpcSession, error) {
var (
- err error
- rpcSession rpcSession
+ err error
+ rs rpcSession
)
c.lock.RLock()
defer c.lock.RUnlock()
if c.sessions == nil {
- return rpcSession, errClientClosed
+ return rs, errClientClosed
}
err = errSessionNotExist
for _, s := range c.sessions {
if s.session == session {
- rpcSession = *s
+ rs = *s
err = nil
break
}
}
- return rpcSession, perrors.WithStack(err)
+ return rs, perrors.WithStack(err)
}
func (c *gettyRPCClient) isAvailable() bool {
@@ -363,16 +363,16 @@ func (p *gettyRPCClientPool) close() {
}
func (p *gettyRPCClientPool) getGettyRpcClient(addr string) (*gettyRPCClient, error) {
- conn, err := p.get()
- if err == nil && conn == nil {
+ conn, connErr := p.get()
+ if connErr == nil && conn == nil {
// create new conn
- rpcClientConn, err := newGettyRPCClientConn(p, addr)
- if err == nil {
+ rpcClientConn, rpcErr := newGettyRPCClientConn(p, addr)
+ if rpcErr == nil {
p.put(rpcClientConn)
}
- return rpcClientConn, perrors.WithStack(err)
+ return rpcClientConn, perrors.WithStack(rpcErr)
}
- return conn, perrors.WithStack(err)
+ return conn, perrors.WithStack(connErr)
}
func (p *gettyRPCClientPool) get() (*gettyRPCClient, error) {
diff --git a/remoting/zookeeper/client.go b/remoting/zookeeper/client.go
index fbd9076..852a556 100644
--- a/remoting/zookeeper/client.go
+++ b/remoting/zookeeper/client.go
@@ -128,18 +128,18 @@ func ValidateZookeeperClient(container ZkClientFacade, opts ...Option) error {
if container.ZkClient() == nil {
// in dubbo, every registry only connect one node, so this is []string{r.Address}
- timeout, err := time.ParseDuration(url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT))
- if err != nil {
- logger.Errorf("timeout config %v is invalid ,err is %v",
- url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT), err.Error())
- return perrors.WithMessagef(err, "newZookeeperClient(address:%+v)", url.Location)
+ timeout, paramErr := time.ParseDuration(url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT))
+ if paramErr != nil {
+ logger.Errorf("timeout config %v is invalid, err is %v",
+ url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT), paramErr.Error())
+ return perrors.WithMessagef(paramErr, "newZookeeperClient(address:%+v)", url.Location)
}
zkAddresses := strings.Split(url.Location, ",")
- newClient, err := NewZookeeperClient(options.zkName, zkAddresses, timeout)
- if err != nil {
+ newClient, cltErr := NewZookeeperClient(options.zkName, zkAddresses, timeout)
+ if cltErr != nil {
logger.Warnf("newZookeeperClient(name{%s}, zk address{%v}, timeout{%d}) = error{%v}",
- options.zkName, url.Location, timeout.String(), err)
- return perrors.WithMessagef(err, "newZookeeperClient(address:%+v)", url.Location)
+ options.zkName, url.Location, timeout.String(), cltErr)
+ return perrors.WithMessagef(cltErr, "newZookeeperClient(address:%+v)", url.Location)
}
container.SetZkClient(newClient)
connected = true
diff --git a/remoting/zookeeper/client_test.go b/remoting/zookeeper/client_test.go
index af09edb..3d09499 100644
--- a/remoting/zookeeper/client_test.go
+++ b/remoting/zookeeper/client_test.go
@@ -96,7 +96,7 @@ func TestCreate(t *testing.T) {
ts, z, event, err := NewMockZookeeperClient("test", 15*time.Second)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.Nil(t, err)
}()
err = z.Create("test1/test2/test3/test4")
@@ -110,7 +110,7 @@ func TestCreateDelete(t *testing.T) {
ts, z, event, err := NewMockZookeeperClient("test", 15*time.Second)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.Nil(t, err)
}()
@@ -127,7 +127,7 @@ func TestRegisterTemp(t *testing.T) {
ts, z, event, err := NewMockZookeeperClient("test", 15*time.Second)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.Nil(t, err)
}()
err = z.Create("/test1/test2/test3")
@@ -144,7 +144,7 @@ func TestRegisterTempSeq(t *testing.T) {
ts, z, event, err := NewMockZookeeperClient("test", 15*time.Second)
assert.NoError(t, err)
defer func() {
- err := ts.Stop()
+ _ = ts.Stop()
assert.Nil(t, err)
}()
err = z.Create("/test1/test2/test3")
diff --git a/remoting/zookeeper/listener.go b/remoting/zookeeper/listener.go
index 7b90e52..3eda6d9 100644
--- a/remoting/zookeeper/listener.go
+++ b/remoting/zookeeper/listener.go
@@ -135,9 +135,10 @@ func (l *ZkEventListener) handleZkNodeEvent(zkPath string, children []string, li
newChildren, err := l.client.GetChildren(zkPath)
if err != nil {
if err == errNilChildren {
- content, _, err := l.client.Conn.Get(zkPath)
- if err != nil {
- logger.Errorf("Get new node path {%v} 's content error,message is {%v}", zkPath, perrors.WithStack(err))
+ content, _, connErr := l.client.Conn.Get(zkPath)
+ if connErr != nil {
+ logger.Errorf("Get new node path {%v} 's content error,message is {%v}",
+ zkPath, perrors.WithStack(connErr))
} else {
listener.DataChange(remoting.Event{Path: zkPath, Action: remoting.EventTypeUpdate, Content: string(content)})
}
@@ -158,9 +159,10 @@ func (l *ZkEventListener) handleZkNodeEvent(zkPath string, children []string, li
newNode = path.Join(zkPath, n)
logger.Infof("add zkNode{%s}", newNode)
- content, _, err := l.client.Conn.Get(newNode)
- if err != nil {
- logger.Errorf("Get new node path {%v} 's content error,message is {%v}", newNode, perrors.WithStack(err))
+ content, _, connErr := l.client.Conn.Get(newNode)
+ if connErr != nil {
+ logger.Errorf("Get new node path {%v} 's content error,message is {%v}",
+ newNode, perrors.WithStack(connErr))
}
if !listener.DataChange(remoting.Event{Path: zkPath, Action: remoting.EventTypeAdd, Content: string(content)}) {