1use std::env;
2
3use lazy_static::lazy_static;
4
5lazy_static! {
6 pub static ref RELEASE_CHANNEL_NAME: String = if cfg!(debug_assertions) {
7 env::var("ZED_RELEASE_CHANNEL")
8 .unwrap_or_else(|_| include_str!("../../zed/RELEASE_CHANNEL").to_string())
9 } else {
10 include_str!("../../zed/RELEASE_CHANNEL").to_string()
11 };
12 pub static ref RELEASE_CHANNEL: ReleaseChannel = match RELEASE_CHANNEL_NAME.as_str() {
13 "dev" => ReleaseChannel::Dev,
14 "preview" => ReleaseChannel::Preview,
15 "stable" => ReleaseChannel::Stable,
16 _ => panic!("invalid release channel {}", *RELEASE_CHANNEL_NAME),
17 };
18}
19
20#[derive(Copy, Clone, PartialEq, Eq, Default)]
21pub enum ReleaseChannel {
22 #[default]
23 Dev,
24 Preview,
25 Stable,
26}
27
28impl ReleaseChannel {
29 pub fn display_name(&self) -> &'static str {
30 match self {
31 ReleaseChannel::Dev => "Zed Dev",
32 ReleaseChannel::Preview => "Zed Preview",
33 ReleaseChannel::Stable => "Zed",
34 }
35 }
36
37 pub fn dev_name(&self) -> &'static str {
38 match self {
39 ReleaseChannel::Dev => "dev",
40 ReleaseChannel::Preview => "preview",
41 ReleaseChannel::Stable => "stable",
42 }
43 }
44
45 pub fn url_scheme(&self) -> &'static str {
46 match self {
47 ReleaseChannel::Dev => "zed-dev://",
48 ReleaseChannel::Preview => "zed-preview://",
49 ReleaseChannel::Stable => "zed://",
50 }
51 }
52
53 pub fn link_prefix(&self) -> &'static str {
54 match self {
55 ReleaseChannel::Dev => "https://zed.dev/dev/",
56 ReleaseChannel::Preview => "https://zed.dev/preview/",
57 ReleaseChannel::Stable => "https://zed.dev/",
58 }
59 }
60}
61
62pub fn parse_zed_link(link: &str) -> Option<&str> {
63 for release in [
64 ReleaseChannel::Dev,
65 ReleaseChannel::Preview,
66 ReleaseChannel::Stable,
67 ] {
68 if let Some(stripped) = link.strip_prefix(release.link_prefix()) {
69 return Some(stripped);
70 }
71 if let Some(stripped) = link.strip_prefix(release.url_scheme()) {
72 return Some(stripped);
73 }
74 }
75 None
76}