maps-service/validation/src/validator.rs

114 lines
2.9 KiB
Rust
Raw Normal View History

2024-12-03 06:09:01 +00:00
use futures::StreamExt;
2024-12-03 06:52:01 +00:00
use crate::nats_types::ValidateRequest;
struct ModelVersion{
model_id:u64,
model_version:u64,
}
2024-12-03 06:09:01 +00:00
enum Valid{
2024-12-03 06:52:01 +00:00
Untouched,
Modified(ModelVersion),
2024-12-03 06:09:01 +00:00
}
2024-12-03 06:52:01 +00:00
#[allow(dead_code)]
#[derive(Debug)]
2024-12-03 06:09:01 +00:00
enum ValidateError{
2024-12-03 06:52:01 +00:00
Get(rbx_asset::cookie::GetError),
Json(serde_json::Error),
ReadDom(ReadDomError),
2024-12-03 06:09:01 +00:00
}
2024-12-03 06:52:01 +00:00
impl std::fmt::Display for ValidateError{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for ValidateError{}
2024-12-03 06:09:01 +00:00
pub struct Validator{
nats:async_nats::Client,
subscriber:async_nats::Subscriber,
2024-12-03 06:52:01 +00:00
roblox_cookie:rbx_asset::cookie::CookieContext,
2024-12-03 06:09:01 +00:00
}
2024-12-03 06:52:01 +00:00
2024-12-03 06:09:01 +00:00
impl Validator{
2024-12-03 06:52:01 +00:00
pub async fn new(
nats:async_nats::Client,
roblox_cookie:rbx_asset::cookie::CookieContext,
)->Result<Self,async_nats::SubscribeError>{
2024-12-03 06:09:01 +00:00
Ok(Self{
subscriber:nats.subscribe("validate").await?,
nats,
2024-12-03 06:52:01 +00:00
roblox_cookie,
2024-12-03 06:09:01 +00:00
})
}
pub async fn run(mut self){
while let Some(message)=self.subscriber.next().await{
2024-12-03 06:52:01 +00:00
self.validate_supress_error(message).await
}
}
async fn validate_supress_error(&self,message:async_nats::Message){
match self.validate(message).await{
Ok(valid)=>{
unimplemented!();
// self.nats.publish("validated","yo it validated".into()).await.unwrap();
},
Err(e)=>{
println!("there was an error, oopsie! {e}");
}
2024-12-03 06:09:01 +00:00
}
}
2024-12-03 06:52:01 +00:00
async fn validate(&self,message:async_nats::Message)->Result<Valid,ValidateError>{
2024-12-03 06:09:01 +00:00
println!("validate {:?}",message);
2024-12-03 06:52:01 +00:00
// decode json
let validate_info:ValidateRequest=serde_json::from_slice(&message.payload).map_err(ValidateError::Json)?;
2024-12-03 06:09:01 +00:00
// download map
2024-12-03 06:52:01 +00:00
let data=self.roblox_cookie.get_asset(rbx_asset::cookie::GetAssetRequest{
asset_id:validate_info.model_id,
version:Some(validate_info.model_version),
}).await.map_err(ValidateError::Get)?;
// decode dom (slow!)
let mut dom=read_dom(&mut std::io::Cursor::new(data)).map_err(ValidateError::ReadDom)?;
2024-12-03 06:09:01 +00:00
// validate map
// validate(dom)
2024-12-03 06:52:01 +00:00
2024-12-03 06:09:01 +00:00
// reply with validity
2024-12-03 06:52:01 +00:00
Ok(Valid::Untouched)
}
}
#[allow(dead_code)]
#[derive(Debug)]
enum ReadDomError{
Binary(rbx_binary::DecodeError),
Xml(rbx_xml::DecodeError),
Read(std::io::Error),
Seek(std::io::Error),
UnknownFormat([u8;8]),
}
impl std::fmt::Display for ReadDomError{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for ReadDomError{}
fn read_dom<R:std::io::Read+std::io::Seek>(input:&mut R)->Result<rbx_dom_weak::WeakDom,ReadDomError>{
let mut first_8=[0u8;8];
std::io::Read::read_exact(input,&mut first_8).map_err(ReadDomError::Read)?;
std::io::Seek::rewind(input).map_err(ReadDomError::Seek)?;
match &first_8[0..4]{
b"<rob"=>{
match &first_8[4..8]{
b"lox!"=>rbx_binary::from_reader(input).map_err(ReadDomError::Binary),
b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(ReadDomError::Xml),
_=>Err(ReadDomError::UnknownFormat(first_8)),
}
},
_=>Err(ReadDomError::UnknownFormat(first_8)),
2024-12-03 06:09:01 +00:00
}
}