# rustsn - This Rust-based tool generates, compiles, and tests code using LLMs, resolves dependencies, and provides explanations of existing code through embeddings. ## Features 1. **generate function** command is used to generate code snippets based on user-provided explanations. 2. TODO: **generate application** command is used to generate seed project code based on user-provided explanations. 3. **ask** command is used to get explanation by existing codes of your project based on user-provided question. ## Supported languages by feature | language | generate function | generate application | ask | |------------|-------------------|----------------------|-----| | Rust | + | - | + | | JavaScript | + | - | + | | C# | - | - | + | | Python | + | - | - | | TypeScript | + | - | - | | Java | + | - | - | | Kotlin | + | - | - | | Swift | + | - | - | | PHP | + | - | - | | Scala | + | - | - | ## Project name explanation Project name "rustsn" is a combination of "Rust" and "Snippet" words. Code snippets are generated by the tool written in Rust language. ## Installation ### Prerequisites - **Rust**: Ensure you have Rust installed. You can install it from [here](https://www.rust-lang.org/tools/install). - **Make a decision**: Use Ollama (free and launched on your machine) or the OpenAI API (paid and launched on OpenAI servers). - **If you choose Ollama**: Required for LLM interactions. Install from [Ollama's official site](https://ollama.ai/). - Download Ollam models ```bash ollama pull qwen2.5-coder:7b ollama pull bge-large # if your need "ask" command functionality for existed project code ``` - Set environment variable OLLAMA_NUM_PARALLEL_REQUESTS=2 if you plan launch gemma2:9b and bge-large models in parallel for "ask" command (do not forger to restart your PC) - **If you choose OpenAI API**: Create file "token.txt" in the root folder and put your OpenAI API key there. ### Install CLI Tool via Cargo ```bash cargo install rustsn ``` This command will download the package source from crates.io, build it, and install the binary into the standard Cargo binaries directory ($HOME/.cargo/bin on Unix-like systems, or %USERPROFILE%\.cargo\bin on Windows). If PATH variable is correctly configured, you can run the tool from any directory. ## Usage - Generate Function 1. **Start the Program** ```bash rustsn generate function --lang=rust ``` 2. **Provide an Explanation** The program will prompt: ``` Explain what the function should do: ``` Enter a detailed explanation of the function you want to generate. ``` parse json string and return struct User (age, name) ``` 3. **Completion** Once the code compiles and all tests pass, the final code and tests will be displayed and result of work will be saved in `sandbox` folder. For example: ``` [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Debug)] struct User { name: String, age: u32, } fn solution(json_string: &str) -> Result { let user: User = serde_json::from_str(json_string)?; Ok(user) } #[cfg(test)] mod tests { use super::*; #[test] fn test_solution() { let json_string = r#"{"name": "John Doe", "age": 30}"#; let user = solution(json_string).unwrap(); assert_eq!(user.name, "John Doe"); assert_eq!(user.age, 30); } #[test] fn test_solution_invalid_json() { let json_string = r#"{"name": "John Doe", "age": }"#; assert!(solution(json_string).is_err()); } } Finished ``` ## Usage - Ask 1. **Start the Program** ```bash rustsn ask /path/to/your/project --lang=rust ``` 2. **Provide an Explanation** The program will prompt: ``` Enter the question about your project sources: ``` Enter a question about your project sources. ``` How work parse function for PDF files? ``` 3. **Completion** The program will return the explanation based on the existing code of your project. ``` Find closest files: File: ../shiva/lib\src\pdf.rs ... Answer: The `parse` function for PDF files in the provided Rust code is implemented as part of the `Transformer` struct in the `pdf.rs` file. This function is responsible for converting a PDF document into a `Document` object composed of various `Element` types. Here's a detailed breakdown of how it works: 1. **Load the PDF Document**: - The function takes a reference to a `Bytes` object, which contains the PDF data. - It uses the `lopdf` library to load the PDF document from memory using `PdfDocument::load_mem`. 2. **Iterate Through Pages**: - The function retrieves the pages of the PDF using `pdf_document.get_pages()`. - It iterates over each page to process its contents. 3. **Process Page Contents**: - For each page, it retrieves the contents using `pdf_document.get_page_contents(page_id)`. - It iterates over each content object in the page and calls the `parse_object` function to process it. 4. **Parse Individual Objects**: - The `parse_object` function is responsible for interpreting the contents of each object in the PDF. - It decodes text using the `PdfDocument::decode_text` method, manages element types like `List`, `Paragraph`, and `Text`, and handles operations associated with text positioning and font changes (e.g., "Tm", "Tf", "Tj", "TJ", "ET"). 5. **Text Collection**: - The function `collect_text` is used to gather and decode text from PDF objects, considering encoding and operand types. - It adds decoded text to a string and determines when new elements like lists or paragraphs should be started based on the content. 6. **Construct Document Elements**: - The function constructs `Element` types such as `Text`, `Paragraph`, and `List`, and adds them to a vector of elements. - These elements are used to build the final `Document` object, representing the structure and content of the PDF. 7. **Return the Document**: - After processing all pages and objects, the function returns a `Document` instance containing all the parsed elements. In summary, the `parse` function for PDF files reads the PDF data, iterates through its pages and content objects, decodes text, and constructs a structured `Document` composed of various elements, which can then be used for further processing or transformation. ``` ## Contributing I would love to see contributions from the community. If you experience bugs, feel free to open an issue. If you would like to implement a new feature or bug fix, please follow the steps: 1. Do fork 2. Add comment to the [issue](https://github.com/evgenyigumnov/rustsn/issues) that you are going to work on it 3. Create pull request #### License Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Rustsn by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. ## Versions ### 0.22.0 - "Ask" command for C# and JavaScript 11 October 2024 - Add "ask" command for C# and JavaScript languages ### 0.17.0 - "Ask" command 11 October 2024 - Add "ask" command to get explanation by existing codes of your project based on user-provided question ### 0.16.0 - MIT or Apache-2.0 26 September 2024 - Add MIT or Apache-2.0 license ### 0.15.0 - TypeScript 24 September 2024 - Add TypeScript language support ### 0.14.0 - Swift 23 September 2024 - Add Swift language support ### 0.13.0 - Kotlin 23 September 2024 - Add Kotlin language support ### 0.12.0 - Python 22 September 2024 - Add Python language support ### 0.11.0 - PHP 22 September 2024 - Add PHP language support ### 0.10.0 - JavaScript 22 September 2024 - Add JavaScript language support ### 0.9.0 - Scala 22 September 2024 - Add Scala language support ### 0.8.0 - Java 22 September 2024 - Add Java language support ### 0.7.0 - Simplification 22 September 2024 - Simplify state machine logic and remove logic.md file - Simplify prompt.txt file ### 0.6.0 - Add "clap" crate 21 September 2024 - Add --lang parameter to specify the language of the generated code (Rust, Python, C, JavaScript, Java, TypeScript, CPP, Scala, Kotlin, Swift) ### 0.5.0 - Support multi-language code generation 21 September 2024 - Make decision to support multi-language code generation: Python, C, JavaScript, Java, TypeScript, CPP, Scala, Kotlin, Swift ### 0.4.0 - LLM Generate Result Extraction - 20 September 2024 - Extract_code function replaced by extract_code, extract_dep, extract_test functions ### 0.3.0 - State Machine - 20 September 2024 - Support OpenAI API ### 0.2.0 - State Machine - 19 September 2024 - Moved prompts from code to "rust.prompt" file - Moved logic from code to "logic.md" file ### 0.1.0 - Prototype - 17 September 2024 - Code Generation - Automated Compilation - Dependency Resolution - Test Generation - Error Correction - Caching Mechanism