rustgym 0.2.0

rustgym solutions
Documentation
use std::cell::RefCell;
use std::rc::Rc;

struct Solution {
    file: Vec<char>,
    index: Rc<RefCell<usize>>,
}

impl Solution {
    fn new(file: String) -> Self {
        let file = file.chars().collect();
        let index = Rc::new(RefCell::new(0));
        Solution { file, index }
    }

    fn read4(&self, buf4: &mut [char]) -> i32 {
        for i in 0..4 {
            if *self.index.borrow() == self.file.len() {
                return i as i32;
            }
            buf4[i] = self.file[*self.index.borrow()];
            *self.index.borrow_mut() += 1;
        }
        4
    }
}

impl Solution {
    fn read(&self, buf: &mut [char], n: i32) -> i32 {
        let n = n as usize;
        let mut buf4: Vec<char> = vec![' '; 4];
        let mut i = 0;
        let mut j = 0;
        let mut m = 0;
        while i < n {
            if m == 0 {
                j = 0;
                m = self.read4(&mut buf4);
                if m == 0 {
                    break;
                }
            } else {
                buf[i] = buf4[j];
                i += 1;
                j += 1;
                m -= 1;
            }
        }
        i as i32
    }
}

#[test]
fn test() {
    let obj = Solution::new("abc".to_string());
    let n = 4;
    let mut buf = vec![' '; 100];
    let res = 3;
    assert_eq!(obj.read(&mut buf, n), res);
    let obj = Solution::new("abcde".to_string());
    let n = 5;
    let mut buf = vec![' '; 100];
    let res = 5;
    assert_eq!(obj.read(&mut buf, n), res);
    let obj = Solution::new("abcdABCD1234".to_string());
    let n = 12;
    let mut buf = vec![' '; 100];
    let res = 12;
    assert_eq!(obj.read(&mut buf, n), res);
    let obj = Solution::new("leetcode".to_string());
    let n = 5;
    let mut buf = vec![' '; 100];
    let res = 5;
    assert_eq!(obj.read(&mut buf, n), res);
}