This commit is contained in:
parent
0325be4ddc
commit
47f8b48407
13
.drone.yml
Normal file
13
.drone.yml
Normal file
@ -0,0 +1,13 @@
|
||||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: hub.aidev.ru/rust
|
||||
commands:
|
||||
- cargo build --verbose --all
|
||||
|
||||
- name: fmt-check
|
||||
image: hub.aidev.ru/rust
|
||||
commands:
|
||||
- cargo fmt --all -- --check
|
@ -10,3 +10,9 @@ name = "wplug"
|
||||
path = "./bin/wplug.rs"
|
||||
|
||||
[dependencies]
|
||||
clap = {version = "3.1.6", features = ["derive"]}
|
||||
serde = "1.0.136"
|
||||
serde_derive = "1.0.136"
|
||||
slab = "0.4.5"
|
||||
thiserror = "1.0.30"
|
||||
toml = "0.5.8"
|
||||
|
@ -6,3 +6,5 @@ Create and manage `wplug` packages:
|
||||
- create packages
|
||||
- verify
|
||||
- upload to registry
|
||||
|
||||
|
||||
|
21
bin/wplug.rs
21
bin/wplug.rs
@ -1,6 +1,25 @@
|
||||
use clap::{Parser, Subcommand};
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
#[clap(author, version, about, long_about = None)]
|
||||
#[clap(propagate_version = true)]
|
||||
pub struct Args {
|
||||
#[clap(subcommand)]
|
||||
cmd: ArgsCoommans,
|
||||
}
|
||||
|
||||
#[derive(Debug, Subcommand)]
|
||||
pub enum ArgsCoommans {
|
||||
Info,
|
||||
List,
|
||||
Search { query: String },
|
||||
Publish,
|
||||
Login,
|
||||
Add { name: String },
|
||||
Remove { name: String },
|
||||
Update,
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
|
||||
println!("{:?}", Args::parse());
|
||||
}
|
||||
|
35
src/catalog.rs
Normal file
35
src/catalog.rs
Normal file
@ -0,0 +1,35 @@
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
|
||||
use crate::{metadata::PluginMetadata, Error, PluginId, PluginLink};
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginSearchResult {
|
||||
items: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub struct PluginSearchQuery {
|
||||
pub title: String,
|
||||
pub keywords: String,
|
||||
pub categories: Vec<String>,
|
||||
}
|
||||
|
||||
pub struct PluginCatalog {}
|
||||
|
||||
impl PluginCatalog {
|
||||
pub fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
pub async fn search_plugin(
|
||||
&self,
|
||||
query: PluginSearchQuery,
|
||||
) -> Result<PluginSearchResult, Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
pub async fn plugin_metadata(&self, plugin_id: PluginId) -> Result<PluginMetadata, Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
pub async fn plugin_link(&self) -> Result<PluginLink, Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
7
src/error.rs
Normal file
7
src/error.rs
Normal file
@ -0,0 +1,7 @@
|
||||
use thiserror::Error;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
#[error("test")]
|
||||
Variant1,
|
||||
}
|
79
src/lib.rs
79
src/lib.rs
@ -1,4 +1,83 @@
|
||||
mod catalog;
|
||||
mod error;
|
||||
mod metadata;
|
||||
mod plugin;
|
||||
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
|
||||
pub use catalog::{PluginCatalog, PluginSearchQuery};
|
||||
pub use error::Error;
|
||||
use metadata::PluginMetadata;
|
||||
pub use plugin::Plugin;
|
||||
use serde_derive::Deserialize;
|
||||
use slab::Slab;
|
||||
use toml::Value;
|
||||
|
||||
pub type PluginId = u64;
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub enum PluginState {
|
||||
Running,
|
||||
Failed,
|
||||
Unloaded,
|
||||
Updating,
|
||||
Disabled,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub enum PluginLink {
|
||||
GitRepo(String),
|
||||
Url(String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginDescription {
|
||||
metadata: PluginMetadata,
|
||||
state: PluginState,
|
||||
}
|
||||
|
||||
pub struct PluginManager {
|
||||
options: HashMap<(PluginId, String), Value>,
|
||||
plugins: Slab<Plugin>,
|
||||
}
|
||||
|
||||
impl PluginManager {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
options: Default::default(),
|
||||
plugins: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn start() {}
|
||||
|
||||
pub fn plugin_list(&self) -> Vec<Arc<PluginDescription>> {
|
||||
vec![]
|
||||
}
|
||||
|
||||
pub async fn update_plugin_option() {}
|
||||
|
||||
pub async fn send_message() {}
|
||||
|
||||
pub async fn request() {}
|
||||
|
||||
// Plugin Management
|
||||
|
||||
pub async fn install_plugin() {}
|
||||
|
||||
pub async fn uninstall_plugin() {}
|
||||
|
||||
pub async fn download_plugin(&self, link: PluginLink) -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn disable_plugin() {}
|
||||
|
||||
// Plugin Runtime
|
||||
|
||||
pub async fn reset_plugin() {}
|
||||
|
||||
pub async fn load_plugin() {}
|
||||
|
||||
pub async fn unload_plugin() {}
|
||||
}
|
||||
|
221
src/metadata.rs
Normal file
221
src/metadata.rs
Normal file
@ -0,0 +1,221 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use serde_derive::Deserialize;
|
||||
use toml::Value;
|
||||
|
||||
///
|
||||
///
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataHook {
|
||||
entry: String,
|
||||
}
|
||||
|
||||
///
|
||||
///
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataExportArgument {
|
||||
name: String,
|
||||
#[serde(rename = "type")]
|
||||
ty: String,
|
||||
default: Option<Value>,
|
||||
required: bool,
|
||||
}
|
||||
|
||||
///
|
||||
/// Plugin Export Definition
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataExport {
|
||||
name: String,
|
||||
args: Vec<PluginMetadataExportArgument>,
|
||||
entry: String,
|
||||
}
|
||||
|
||||
///
|
||||
/// Plugin Export Key Mapping
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataExportKeyMapping {
|
||||
entry: String,
|
||||
args: Vec<PluginMetadataExportArgument>,
|
||||
mapping: String,
|
||||
}
|
||||
|
||||
///
|
||||
/// Plugin Metadata Dependency
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataDependency {
|
||||
///
|
||||
/// Dependecy name
|
||||
name: String,
|
||||
|
||||
///
|
||||
/// Version match pattern
|
||||
version: Option<String>,
|
||||
|
||||
///
|
||||
/// Git repository url
|
||||
git: Option<String>,
|
||||
|
||||
///
|
||||
/// Branch name in case of git repository url set
|
||||
branch: Option<String>,
|
||||
|
||||
///
|
||||
/// Revision number in case of git repository url set
|
||||
rev: Option<String>,
|
||||
|
||||
///
|
||||
/// Path in case package is in file system
|
||||
path: Option<String>,
|
||||
}
|
||||
|
||||
///
|
||||
/// Plugin Metadata Configuration Option
|
||||
///
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadataOption {
|
||||
///
|
||||
/// Option name
|
||||
///
|
||||
name: String,
|
||||
|
||||
///
|
||||
/// Value Type
|
||||
///
|
||||
#[serde(rename = "type")]
|
||||
ty: String,
|
||||
|
||||
///
|
||||
/// Description
|
||||
///
|
||||
description: Option<String>,
|
||||
|
||||
///
|
||||
/// Option default value
|
||||
///
|
||||
default: Option<Value>,
|
||||
|
||||
///
|
||||
/// Option required flag
|
||||
required: bool,
|
||||
}
|
||||
|
||||
///
|
||||
/// Plugin Metadata
|
||||
///
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PluginMetadata {
|
||||
///
|
||||
/// Plugin name
|
||||
///
|
||||
name: String,
|
||||
|
||||
///
|
||||
/// Plugin version signature
|
||||
///
|
||||
version: String,
|
||||
|
||||
///
|
||||
/// Licence
|
||||
///
|
||||
licence: String,
|
||||
|
||||
///
|
||||
/// Title
|
||||
///
|
||||
title: String,
|
||||
|
||||
///
|
||||
/// Description
|
||||
///
|
||||
description: String,
|
||||
|
||||
///
|
||||
/// List of plugin's authors
|
||||
///
|
||||
authors: Vec<String>,
|
||||
|
||||
///
|
||||
/// Plugin documentation URL
|
||||
///
|
||||
documentation: String,
|
||||
|
||||
///
|
||||
/// Plugin homepage URL
|
||||
///
|
||||
homepage: String,
|
||||
|
||||
///
|
||||
/// Plugin repository URL
|
||||
///
|
||||
repository: String,
|
||||
|
||||
///
|
||||
/// Plugin keywords for search optiomization
|
||||
///
|
||||
keywords: Vec<String>,
|
||||
|
||||
///
|
||||
/// API set pluging is using
|
||||
/// - if plugin uses only editor api (i.e. cursor or buffer content) it should be installed
|
||||
/// locally
|
||||
/// - if plugin needs to run commands or acces to fs - so it should be installed remotly
|
||||
///
|
||||
api_version: String,
|
||||
|
||||
///
|
||||
/// List of categories the plugin is related to
|
||||
///
|
||||
categories: String,
|
||||
|
||||
///
|
||||
/// Resources to include to publishing package
|
||||
///
|
||||
include: Vec<String>,
|
||||
|
||||
///
|
||||
/// Files or folders to exclude from publishing the plugin
|
||||
///
|
||||
exclude: Vec<String>,
|
||||
|
||||
///
|
||||
/// Plugin dependencies
|
||||
///
|
||||
dependencies: Vec<PluginMetadataDependency>,
|
||||
|
||||
///
|
||||
/// Configuration options for the plugin
|
||||
///
|
||||
options: Vec<PluginMetadataOption>,
|
||||
|
||||
///
|
||||
/// Plugin event hooks
|
||||
///
|
||||
hooks: HashMap<String, PluginMetadataHook>,
|
||||
|
||||
///
|
||||
/// Plugin Exports
|
||||
///
|
||||
exports: Vec<PluginMetadataExport>,
|
||||
|
||||
///
|
||||
/// Key Mapping Exports
|
||||
///
|
||||
export_key_mappings: Vec<PluginMetadataExportKeyMapping>,
|
||||
|
||||
///
|
||||
/// Assets
|
||||
/// - binary: Wasm Binary
|
||||
/// - tree-sitter: tree-sitter plugin
|
||||
/// - theme: App theme styles
|
||||
/// - icons: icon pack
|
||||
/// - syntax: Syntax theme colors
|
||||
/// - readme: Readme file
|
||||
///
|
||||
assets: HashMap<String, String>,
|
||||
}
|
43
src/plugin.rs
Normal file
43
src/plugin.rs
Normal file
@ -0,0 +1,43 @@
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
|
||||
use toml::Value;
|
||||
|
||||
use crate::{metadata::PluginMetadata, Error};
|
||||
|
||||
pub struct PluginApiInfo {}
|
||||
|
||||
pub struct PluginInfo {
|
||||
pub api: PluginApiInfo,
|
||||
pub options: HashMap<String, Value>,
|
||||
}
|
||||
|
||||
pub struct Plugin {
|
||||
metadata: Arc<PluginMetadata>,
|
||||
}
|
||||
|
||||
impl Plugin {
|
||||
pub fn metadata(&self) -> Result<PluginMetadata, Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
pub fn enumerate_callables(&self) -> impl Iterator<Item = ()> {
|
||||
vec![].into_iter()
|
||||
}
|
||||
|
||||
// Plugin API
|
||||
|
||||
pub async fn initialize(&mut self) -> Result<(), Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
pub async fn destroy(&mut self) {}
|
||||
|
||||
pub async fn handle(&self, cmd_id: String, args: Vec<Value>) -> Result<Value, Error> {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PluginCall {
|
||||
name: String,
|
||||
args: Vec<Value>,
|
||||
}
|
8
wplug_lib/Cargo.toml
Normal file
8
wplug_lib/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "wplug_lib"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
12
wplug_lib/src/core.rs
Normal file
12
wplug_lib/src/core.rs
Normal file
@ -0,0 +1,12 @@
|
||||
pub async fn api_call_async() {
|
||||
|
||||
}
|
||||
|
||||
pub fn api_call() {
|
||||
|
||||
}
|
||||
|
||||
pub fn host_info() {
|
||||
|
||||
}
|
||||
|
0
wplug_lib/src/lib.rs
Normal file
0
wplug_lib/src/lib.rs
Normal file
Loading…
Reference in New Issue
Block a user