mirror of
https://github.com/alibaba/higress.git
synced 2026-04-22 04:27:26 +08:00
feat: extract boilerplate code of on_configure to function (DRY) (#396)
This commit is contained in:
@@ -13,12 +13,12 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use higress_wasm_rust::log::Log;
|
use higress_wasm_rust::log::Log;
|
||||||
use higress_wasm_rust::rule_matcher::RuleMatcher;
|
use higress_wasm_rust::rule_matcher::{on_configure, RuleMatcher};
|
||||||
use proxy_wasm::traits::{Context, HttpContext, RootContext};
|
use proxy_wasm::traits::{Context, HttpContext, RootContext};
|
||||||
use proxy_wasm::types::{Action, ContextType, LogLevel};
|
use proxy_wasm::types::{Action, ContextType, LogLevel};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde_json::{from_slice, Value};
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
use std::ops::DerefMut;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
proxy_wasm::main! {{
|
proxy_wasm::main! {{
|
||||||
@@ -53,29 +53,12 @@ impl Context for SayHelloRoot {}
|
|||||||
|
|
||||||
impl RootContext for SayHelloRoot {
|
impl RootContext for SayHelloRoot {
|
||||||
fn on_configure(&mut self, _plugin_configuration_size: usize) -> bool {
|
fn on_configure(&mut self, _plugin_configuration_size: usize) -> bool {
|
||||||
let config_buffer = match self.get_plugin_configuration() {
|
on_configure(
|
||||||
None => {
|
self,
|
||||||
self.log
|
_plugin_configuration_size,
|
||||||
.error("Error when configuring RootContext, no configuration supplied");
|
self.rule_matcher.borrow_mut().deref_mut(),
|
||||||
return false;
|
&self.log,
|
||||||
}
|
)
|
||||||
Some(bytes) => bytes,
|
|
||||||
};
|
|
||||||
|
|
||||||
let value = match from_slice::<Value>(config_buffer.as_slice()) {
|
|
||||||
Err(error) => {
|
|
||||||
self.log.error(
|
|
||||||
format!("cannot parse plugin configuration JSON string: {}", error).as_str(),
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Ok(value) => value,
|
|
||||||
};
|
|
||||||
|
|
||||||
self.rule_matcher
|
|
||||||
.borrow_mut()
|
|
||||||
.parse_rule_config(&value)
|
|
||||||
.is_ok()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_http_context(&self, _context_id: u32) -> Option<Box<dyn HttpContext>> {
|
fn create_http_context(&self, _context_id: u32) -> Option<Box<dyn HttpContext>> {
|
||||||
|
|||||||
@@ -14,11 +14,13 @@
|
|||||||
|
|
||||||
use crate::error::WasmRustError;
|
use crate::error::WasmRustError;
|
||||||
use crate::internal::{get_http_request_header, get_property};
|
use crate::internal::{get_http_request_header, get_property};
|
||||||
|
use crate::log::Log;
|
||||||
use proxy_wasm::hostcalls::log;
|
use proxy_wasm::hostcalls::log;
|
||||||
|
use proxy_wasm::traits::RootContext;
|
||||||
use proxy_wasm::types::LogLevel;
|
use proxy_wasm::types::LogLevel;
|
||||||
use serde_json::{Map, Value};
|
|
||||||
use std::collections::HashSet;
|
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
|
use serde_json::{from_slice, Map, Value};
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
enum Category {
|
enum Category {
|
||||||
Route,
|
Route,
|
||||||
@@ -55,12 +57,9 @@ pub struct RuleMatcher<PluginConfig> {
|
|||||||
|
|
||||||
impl<PluginConfig> RuleMatcher<PluginConfig>
|
impl<PluginConfig> RuleMatcher<PluginConfig>
|
||||||
where
|
where
|
||||||
PluginConfig: Default+DeserializeOwned,
|
PluginConfig: Default + DeserializeOwned,
|
||||||
{
|
{
|
||||||
pub fn parse_rule_config(
|
pub fn parse_rule_config(&mut self, config: &Value) -> Result<(), WasmRustError> {
|
||||||
&mut self,
|
|
||||||
config: &Value,
|
|
||||||
) -> Result<(), WasmRustError> {
|
|
||||||
let empty_object = Map::new();
|
let empty_object = Map::new();
|
||||||
let empty_vec = Vec::new();
|
let empty_vec = Vec::new();
|
||||||
|
|
||||||
@@ -216,3 +215,28 @@ where
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn on_configure<RC: RootContext, PluginConfig: Default + DeserializeOwned>(
|
||||||
|
root_context: &RC,
|
||||||
|
_plugin_configuration_size: usize,
|
||||||
|
rule_matcher: &mut RuleMatcher<PluginConfig>,
|
||||||
|
log: &Log,
|
||||||
|
) -> bool {
|
||||||
|
let config_buffer = match root_context.get_plugin_configuration() {
|
||||||
|
None => {
|
||||||
|
log.error("Error when configuring RootContext, no configuration supplied");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Some(bytes) => bytes,
|
||||||
|
};
|
||||||
|
|
||||||
|
let value = match from_slice::<Value>(config_buffer.as_slice()) {
|
||||||
|
Err(error) => {
|
||||||
|
log.error(format!("cannot parse plugin configuration JSON string: {}", error).as_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Ok(value) => value,
|
||||||
|
};
|
||||||
|
|
||||||
|
rule_matcher.parse_rule_config(&value).is_ok()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user