metropolis 0.9.1

A high level easy to use graphics renderer
use std::ops::Mul;
use std::ops::Div;
use std::ops::Add;
use std::ops::Sub;
use std::ops::AddAssign;
use std::ops::MulAssign;
use std::ops::SubAssign;
use std::ops::DivAssign;
use std::fmt;
use std::fmt::Display;
#[derive(Clone,Debug)]
pub struct Vector<T:Clone+std::marker::Copy+Display>{
    pub vec:Vec<T>,
}
impl<T:Clone+Display+Copy+Eq+Ord+Mul+AddAssign+Mul<T, Output = f32>> Vector<T>{
    pub fn dot(self,vec1:Vector<T>)->Option<f32>{
        let mut x=0f32;
        if self.vec.len()!=vec1.vec.len(){
            return None;
        }
        for v in 0..self.vec.len(){
            x+=self.vec[v]*vec1.vec[v];
        }
        Some(x)
    }
}
impl<T:Clone+Display+std::marker::Copy+Mul+Mul<T, Output = T>> Mul<T> for Vector<T>{
    type Output = Self;
    fn mul(self,mul1:T)->Self{
        let mut vec1 = Vector{vec:vec![]};
        for t in self.vec{
            vec1.vec.push(t *mul1);
        }   
        vec1
    }
}
impl<T:Clone+Display+std::marker::Copy+Add+Add<T, Output = T>> Add<T> for Vector<T>{
    type Output = Self;
    fn add(self,add1:T)->Self{
        let mut vec1 = Vector{vec:vec![]};
        for t in self.vec{
            vec1.vec.push(t +add1);
        }   
        vec1
    }
}
impl<T:Clone+Display+std::marker::Copy+Sub+Sub<T, Output = T>> Sub<T> for Vector<T>{
    type Output = Self;
    fn sub(self,sub1:T)->Self{
        let mut vec1 = Vector{vec:vec![]};
        for t in self.vec{
            vec1.vec.push(t -sub1);
        }   
        vec1
    }
}
impl<T:Clone+Display+std::marker::Copy+Div+Div<T, Output = T>> Div<T> for Vector<T>{
    type Output = Self;
    fn div(self,div1:T)->Self{
        let mut vec1 = Vector{vec:vec![]};
        for t in self.vec{
            vec1.vec.push(t /div1);
        }   
        vec1
    }
}
impl<T:Clone+Display+std::marker::Copy+Add+Add<T, Output = T>+AddAssign> AddAssign<T> for Vector<T>{
    fn add_assign(&mut self,add1:T){
        let mut changer = self.clone();
        for t in &mut changer.vec{
            *t+=add1;
        }
        *self = changer;
    }
}
impl<T:Clone+Display+std::marker::Copy+Mul+Mul<T, Output = T>+MulAssign> MulAssign<T> for Vector<T>{
    fn mul_assign(&mut self,mul1:T){
        let mut changer = self.clone();
        for t in &mut changer.vec{
            *t*=mul1;
        }
        *self = changer;
    }
}
impl<T:Clone+Display+std::marker::Copy+Sub+Sub<T, Output = T>+SubAssign> SubAssign<T> for Vector<T>{
    fn sub_assign(&mut self,sub1:T){
        let mut changer = self.clone();
        for t in &mut changer.vec{
            *t-=sub1;
        }
        *self = changer;
    }
}
impl<T:Clone+Display+std::marker::Copy+Div+Div<T, Output = T>+DivAssign> DivAssign<T> for Vector<T>{
    fn div_assign(&mut self,div1:T){
        let mut changer = self.clone();
        for t in &mut changer.vec{
            *t/=div1;
        }
        *self = changer;
    }
}
impl<T:Clone+std::marker::Copy+Display> fmt::Display for Vector<T>{
    fn fmt(&self,f: &mut fmt::Formatter<'_>)->fmt::Result{
        for i in self.vec.clone(){
            write!(f, "{}", i)?;
            }
        Ok(())
    }
}