0

我有这段代码-

type Server struct {
    enforcerMap map[int]*casbin.Enforcer
    adapterMap  map[int]persist.Adapter
}

func NewServer() *Server {
    s := Server{}

    s.enforcerMap = map[int]*casbin.Enforcer{}
    s.adapterMap = map[int]persist.Adapter{}

    return &s
}

func (s *Server) getEnforcer(handle int) (*casbin.Enforcer, error) {
    if _, ok := s.enforcerMap[handle]; ok {
        return s.enforcerMap[handle], nil
    } else {
        return nil, errors.New("enforcer not found")
    }
}

这里 casbin.Enforcer 是 -

type Enforcer struct {
    modelPath string
    // ...
}

链接 - https://github.com/casbin/casbin/blob/master/enforcer.go#L33

并且persist.Adapter是-

type Adapter interface {
    // LoadPolicy loads all policy rules from the storage.
    LoadPolicy(model model.Model) error
    // ...
}

链接 - https://github.com/casbin/casbin/blob/master/persist/adapter.go#L47

rust 中对应的结构和特征是 -

pub struct Enforcer {
    model: Box<dyn Model>,
    // ...
}

链接 - https://github.com/casbin/casbin-rs/blob/master/src/enforcer.rs#L58

pub trait Adapter: Send + Sync {
    async fn load_policy(&self, m: &mut dyn Model) -> Result<()>;
    async fn load_filtered_policy<'a>(
        &mut self,
        m: &mut dyn Model,
        f: Filter<'a>,
    ) -> Result<()>;
    // ...
}

链接 - https://github.com/casbin/casbin-rs/blob/master/src/adapter/mod.rs#L22

我想将代码移植到 rust 中。我写了这个结构 -

pub struct Server {
    enforcerMap: Enforcer,
    adapterMap: Box<dyn Adapter>,
}

NewServer()但我也无法理解如何实施getEnforcer()

4

1 回答 1

1

在您的 go 代码中,您的 NewServer() 函数仅创建服务器结构的实例并初始化服务器实例中包含的哈希图,因此您的 rust 代码将是相似的。在 std::collections 中可以找到 hashmap rust 的使用,以及其他有用的数据类型。所以,稍微编辑一下你的结构来添加一个类似于 go 代码的地图

use std::collections::HashMap;

pub struct Server {
    enforcerMap: HashMap<i32,Enforcer>,
    adapterMap: HashMap<i32,Box<dyn Adapter>>,
}

然后对于 NewServer 函数

impl Server {
    pub fn NewServer()->Self {
        Self {
        enforcerMap:HashMap::new(),
        adapterMap:HashMap::new(),
        }
    }
}
于 2021-06-24T21:56:33.450 回答