init commit with logic

This commit is contained in:
Triston Armstrong 2024-12-10 08:20:22 -05:00
commit 6117b40357
Signed by: tristonarmstrong
GPG Key ID: A23B48AE45EB6EFE
8 changed files with 1696 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

1529
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

10
Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[package]
name = "ferro"
version = "0.1.0"
edition = "2021"
[dependencies]
git2 = "0.19.0"
reqwest = { version = "0.12.9", features = ["blocking"] }
serde = { version = "1.0.215", features = ["derive"] }
serde_json = "1.0.133"

18
README.md Normal file
View File

@ -0,0 +1,18 @@
"Ferro" is inspired by:
Scientific Roots
1. Ferrum: Latin for iron, reflecting Rust's iron/oxidation themes.
2. Ferro-: Greek prefix meaning iron or iron-containing.
Relevant Connections
1. Ferrocene: An iron-containing compound.
2. Ferroelectric: Materials exhibiting iron-like electrical properties.
Simple, Modern Sound
"Ferro" is concise, memorable and has a technical feel, fitting for a Rust CLI tool.

25
src/git_grabber.rs Normal file
View File

@ -0,0 +1,25 @@
use git2::Repository;
use std::{env::current_dir, path::PathBuf};
pub struct GitGrabber {
pub repo: Option<Repository>,
dir: PathBuf,
}
impl GitGrabber {
pub fn new() -> Self {
GitGrabber {
repo: None,
dir: current_dir().unwrap(),
}
}
pub fn get_repo(&mut self) {
let repo = match Repository::open(self.dir.clone()) {
Ok(repo) => repo,
Err(e) => panic!("Failed to open: {}", e),
};
self.repo = Some(repo);
}
}

35
src/main.rs Normal file
View File

@ -0,0 +1,35 @@
mod git_grabber;
mod mind_bridge;
mod transporter;
// use core::panic;
use git_grabber::GitGrabber;
use mind_bridge::*;
// use transporter::Transporter;
fn main() {
// let a = MindGen::new("Some random commit message");
// let mut transporter = Transporter::new();
let mut gg = GitGrabber::new();
gg.get_repo();
gg.repo.unwrap().revwalk().unwrap().for_each(|x| {
if x.is_ok() {
println!("{:?}", x.unwrap())
} else {
println!("No rev")
}
});
return ();
// let res_text = transporter.make_request(a).unwrap().text().unwrap();
// let response: Result<GenRes, _> = serde_json::from_str(&res_text);
// if response.is_err() {
// panic!("oop something went wrong: {:?}", response.err());
// }
// println!("{:#?}", response.unwrap());
}

49
src/mind_bridge.rs Normal file
View File

@ -0,0 +1,49 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
#[allow(unused)]
pub struct GenRes {
model: String,
created_at: String,
response: String,
done: bool,
total_duration: u64,
load_duration: u64,
prompt_eval_count: u64,
prompt_eval_duration: u64,
eval_count: u64,
eval_duration: u64,
}
#[derive(Debug, Serialize)]
struct GenOptions {
temperature: f32,
num_predict: u8,
}
#[derive(Debug, Serialize)]
pub struct MindGen {
model: String,
prompt: String,
stream: bool,
raw: bool,
system: String,
options: GenOptions,
}
impl MindGen {
#[allow(unused)]
pub fn new(input: &str) -> Self {
Self {
model: String::from("llama3.1"),
stream: false,
raw: false,
prompt: String::from(input),
system: String::from("You are a commit message generator. You will generate commit messages following this format Task(<task #>): <commit message> making sure to never go over 90 characters"),
options: GenOptions {
temperature: 0.5,
num_predict: 90
}
}
}
}

29
src/transporter.rs Normal file
View File

@ -0,0 +1,29 @@
use crate::MindGen;
use reqwest::blocking::Client;
#[allow(unused)]
pub static OLLAMA_ENDP: &str = "http://localhost:11434/api/generate";
#[allow(unused)]
pub struct Transporter {
pub client: Client,
}
#[allow(unused)]
impl Transporter {
#[allow(unused)]
pub fn new() -> Self {
Self {
client: Client::new(),
}
}
#[allow(unused)]
pub fn make_request(
&mut self,
gen_data: MindGen,
) -> Result<reqwest::blocking::Response, reqwest::Error> {
let json_body = serde_json::to_string(&gen_data).unwrap();
self.client.post(OLLAMA_ENDP).body(json_body).send()
}
}