toolchains: Expose raw JSON representation of a toolchain (#20721)
Closes #ISSUE Release Notes: - N/A
This commit is contained in:
parent
6ab4b46984
commit
75c545aa1e
5 changed files with 38 additions and 19 deletions
|
@ -20,6 +20,8 @@ pub struct Toolchain {
|
||||||
pub name: SharedString,
|
pub name: SharedString,
|
||||||
pub path: SharedString,
|
pub path: SharedString,
|
||||||
pub language_name: LanguageName,
|
pub language_name: LanguageName,
|
||||||
|
/// Full toolchain data (including language-specific details)
|
||||||
|
pub as_json: serde_json::Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait(?Send)]
|
#[async_trait(?Send)]
|
||||||
|
|
|
@ -591,8 +591,9 @@ impl ToolchainLister for PythonToolchainProvider {
|
||||||
.into();
|
.into();
|
||||||
Some(Toolchain {
|
Some(Toolchain {
|
||||||
name,
|
name,
|
||||||
path: toolchain.executable?.to_str()?.to_owned().into(),
|
path: toolchain.executable.as_ref()?.to_str()?.to_owned().into(),
|
||||||
language_name: LanguageName::new("Python"),
|
language_name: LanguageName::new("Python"),
|
||||||
|
as_json: serde_json::to_value(toolchain).ok()?,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::sync::Arc;
|
use std::{str::FromStr, sync::Arc};
|
||||||
|
|
||||||
use anyhow::{bail, Result};
|
use anyhow::{bail, Result};
|
||||||
|
|
||||||
|
@ -119,6 +119,7 @@ impl ToolchainStore {
|
||||||
let toolchain = Toolchain {
|
let toolchain = Toolchain {
|
||||||
name: toolchain.name.into(),
|
name: toolchain.name.into(),
|
||||||
path: toolchain.path.into(),
|
path: toolchain.path.into(),
|
||||||
|
as_json: serde_json::Value::from_str(&toolchain.raw_json)?,
|
||||||
language_name,
|
language_name,
|
||||||
};
|
};
|
||||||
let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id);
|
let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id);
|
||||||
|
@ -144,6 +145,7 @@ impl ToolchainStore {
|
||||||
toolchain: toolchain.map(|toolchain| proto::Toolchain {
|
toolchain: toolchain.map(|toolchain| proto::Toolchain {
|
||||||
name: toolchain.name.into(),
|
name: toolchain.name.into(),
|
||||||
path: toolchain.path.into(),
|
path: toolchain.path.into(),
|
||||||
|
raw_json: toolchain.as_json.to_string(),
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -182,6 +184,7 @@ impl ToolchainStore {
|
||||||
.map(|toolchain| proto::Toolchain {
|
.map(|toolchain| proto::Toolchain {
|
||||||
name: toolchain.name.to_string(),
|
name: toolchain.name.to_string(),
|
||||||
path: toolchain.path.to_string(),
|
path: toolchain.path.to_string(),
|
||||||
|
raw_json: toolchain.as_json.to_string(),
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
} else {
|
} else {
|
||||||
|
@ -352,6 +355,7 @@ impl RemoteToolchainStore {
|
||||||
toolchain: Some(proto::Toolchain {
|
toolchain: Some(proto::Toolchain {
|
||||||
name: toolchain.name.into(),
|
name: toolchain.name.into(),
|
||||||
path: toolchain.path.into(),
|
path: toolchain.path.into(),
|
||||||
|
raw_json: toolchain.as_json.to_string(),
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
|
@ -383,10 +387,13 @@ impl RemoteToolchainStore {
|
||||||
let toolchains = response
|
let toolchains = response
|
||||||
.toolchains
|
.toolchains
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|toolchain| Toolchain {
|
.filter_map(|toolchain| {
|
||||||
language_name: language_name.clone(),
|
Some(Toolchain {
|
||||||
name: toolchain.name.into(),
|
language_name: language_name.clone(),
|
||||||
path: toolchain.path.into(),
|
name: toolchain.name.into(),
|
||||||
|
path: toolchain.path.into(),
|
||||||
|
as_json: serde_json::Value::from_str(&toolchain.raw_json).ok()?,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
let groups = response
|
let groups = response
|
||||||
|
@ -421,10 +428,13 @@ impl RemoteToolchainStore {
|
||||||
.await
|
.await
|
||||||
.log_err()?;
|
.log_err()?;
|
||||||
|
|
||||||
response.toolchain.map(|toolchain| Toolchain {
|
response.toolchain.and_then(|toolchain| {
|
||||||
language_name: language_name.clone(),
|
Some(Toolchain {
|
||||||
name: toolchain.name.into(),
|
language_name: language_name.clone(),
|
||||||
path: toolchain.path.into(),
|
name: toolchain.name.into(),
|
||||||
|
path: toolchain.path.into(),
|
||||||
|
as_json: serde_json::Value::from_str(&toolchain.raw_json).ok()?,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -2473,6 +2473,7 @@ message ListToolchains {
|
||||||
message Toolchain {
|
message Toolchain {
|
||||||
string name = 1;
|
string name = 1;
|
||||||
string path = 2;
|
string path = 2;
|
||||||
|
string raw_json = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ToolchainGroup {
|
message ToolchainGroup {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
pub mod model;
|
pub mod model;
|
||||||
|
|
||||||
use std::path::Path;
|
use std::{path::Path, str::FromStr};
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, Context, Result};
|
use anyhow::{anyhow, bail, Context, Result};
|
||||||
use client::DevServerProjectId;
|
use client::DevServerProjectId;
|
||||||
|
@ -380,6 +380,9 @@ define_connection! {
|
||||||
PRIMARY KEY (workspace_id, worktree_id, language_name)
|
PRIMARY KEY (workspace_id, worktree_id, language_name)
|
||||||
);
|
);
|
||||||
),
|
),
|
||||||
|
sql!(
|
||||||
|
ALTER TABLE toolchains ADD COLUMN raw_json TEXT DEFAULT "{}";
|
||||||
|
),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1080,18 +1083,19 @@ impl WorkspaceDb {
|
||||||
self.write(move |this| {
|
self.write(move |this| {
|
||||||
let mut select = this
|
let mut select = this
|
||||||
.select_bound(sql!(
|
.select_bound(sql!(
|
||||||
SELECT name, path FROM toolchains WHERE workspace_id = ? AND language_name = ? AND worktree_id = ?
|
SELECT name, path, raw_json FROM toolchains WHERE workspace_id = ? AND language_name = ? AND worktree_id = ?
|
||||||
))
|
))
|
||||||
.context("Preparing insertion")?;
|
.context("Preparing insertion")?;
|
||||||
|
|
||||||
let toolchain: Vec<(String, String)> =
|
let toolchain: Vec<(String, String, String)> =
|
||||||
select((workspace_id, language_name.0.to_owned(), worktree_id.to_usize()))?;
|
select((workspace_id, language_name.0.to_owned(), worktree_id.to_usize()))?;
|
||||||
|
|
||||||
Ok(toolchain.into_iter().next().map(|(name, path)| Toolchain {
|
Ok(toolchain.into_iter().next().and_then(|(name, path, raw_json)| Some(Toolchain {
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
path: path.into(),
|
path: path.into(),
|
||||||
language_name,
|
language_name,
|
||||||
}))
|
as_json: serde_json::Value::from_str(&raw_json).ok()?
|
||||||
|
})))
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -1103,18 +1107,19 @@ impl WorkspaceDb {
|
||||||
self.write(move |this| {
|
self.write(move |this| {
|
||||||
let mut select = this
|
let mut select = this
|
||||||
.select_bound(sql!(
|
.select_bound(sql!(
|
||||||
SELECT name, path, worktree_id, language_name FROM toolchains WHERE workspace_id = ?
|
SELECT name, path, worktree_id, language_name, raw_json FROM toolchains WHERE workspace_id = ?
|
||||||
))
|
))
|
||||||
.context("Preparing insertion")?;
|
.context("Preparing insertion")?;
|
||||||
|
|
||||||
let toolchain: Vec<(String, String, u64, String)> =
|
let toolchain: Vec<(String, String, u64, String, String)> =
|
||||||
select(workspace_id)?;
|
select(workspace_id)?;
|
||||||
|
|
||||||
Ok(toolchain.into_iter().map(|(name, path, worktree_id, language_name)| (Toolchain {
|
Ok(toolchain.into_iter().filter_map(|(name, path, worktree_id, language_name, raw_json)| Some((Toolchain {
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
path: path.into(),
|
path: path.into(),
|
||||||
language_name: LanguageName::new(&language_name),
|
language_name: LanguageName::new(&language_name),
|
||||||
}, WorktreeId::from_proto(worktree_id))).collect())
|
as_json: serde_json::Value::from_str(&raw_json).ok()?
|
||||||
|
}, WorktreeId::from_proto(worktree_id)))).collect())
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue