我有这段代码-
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()
。