您是否购买了昂贵的 Timeular 追踪器,但又不想为他们的专有应用程序付费?这个项目适合你。使用 Timeular Reader,您可以将跟踪器连接到您最喜欢的时间跟踪应用程序。
首先使用--setup
标志运行命令,这将生成配置并让您标记设备的侧面。
timeular-reader --setup
您不必设置所有侧面,在您不想使用的侧面按 q,配置将使用您设置的侧面生成。
初始设置后,您可以修改config.toml
要控制输出的详细程度,您可以传递--verbose
或-v
,您可以添加多个-vvv
以使其更详细。
还有--quiet
、 -q
模式来静音所有输出。
要获取项目 ID 和工作区 ID,请在左侧面板的“管理”下单击“项目”。然后单击您要使用的项目名称。网址应如下所示https://track.toggl.com/{workspace_id}/projects/{project_id}/team
要生成 api 密钥,请转到右上角的个人资料设置。向下滚动后,您将看到生成 API 密钥的选项。
要获取您的工作区 ID,请单击右上角的“您的工作区”,转到“管理”,然后转到“设置”,您应该在 url 中包含工作区 ID。它应该看起来像这样https://app.clockify.me/workspaces/{workspace_id}/settings
注意项目 ID 是可选的
要在左侧获取您的项目 ID,请单击项目,然后单击您的项目。该 url 将包含项目 id。应该看起来像这样https://app.clockify.me/projects/{project_id}/edit
待办事项
待办事项
首先,您需要创建一个新的 mod 并在此处注册它,我们将其称为example
。
您可以通过创建文件src/handler/example.rs
并添加pub mod example;
进入上面链接的文件。 example.rs
必须有一个名为async create_handler(setup: bool)
的公共函数,并且该函数必须返回一个实现Handler
结构。实现需要注释#[async_trait]
您的模组很可能需要一些配置。您可以实现主example.rs
文件中的所有内容,但为了保持干净,我建议声明新的 mod config
。配置模块将负责创建默认配置并将其保存到主配置文件config.toml
中。
首先我们需要添加pub mod config;
到example.rs
并创建文件src/handler/example/config.rs
。在config.rs
中,我们需要创建一个结构体来保存我们需要的所有配置数据,我们将其称为ExampleConfig
。
派生是必要的
# [ derive ( Serialize , Deserialize , Clone , Debug ) ]
pub struct ExampleConfig {
base_url : String ,
api_key : String ,
}
然后我们需要实现Default
和crate::config::Config
。 Default
实现可以使用不会发生太大变化的内容创建结构,例如 API 基本 url。例如:
impl Default for ExampleConfig {
fn default ( ) -> Self {
ExampleConfig {
base_url : String :: from ( "https://api.example.com" ) ,
api_key : String :: new ( ) ,
}
}
}
crate::config::Config
实现可以为空,它只是继承类型和生命周期,它可以如下所示:
impl < ' de > Config < ' de > for ExampleConfig { }
如果您想将配置保存在主配置文件中,您需要有一个唯一的密钥来保存它。
为了方便起见,您可以实现获取和更新配置(从文件/到文件)的方法。否则,您将必须调用crate::config::get_config
和crate::config::update_config
。这些函数可以如下所示:
const CONFIG_KEY : & str = "example" ; pub fn create_config ( ) -> ExampleConfig { crate :: config :: get_config :: < ExampleConfig > ( CONFIG_KEY ) } pub fn update_config ( config : & ExampleConfig ) { crate :: config :: update_config ( CONFIG_KEY , config ) ; }
之后我们需要注册新的处理程序。在src/handler.rs
中,您需要将我们的 mod Example
添加到Handlers
枚举中并为其分配编号。
pub enum Handlers {
Toggl = 1,
Clockify = 2,
Traggo = 3,
Hackaru = 4,
+ Example = 5,
}
然后我们需要调整TryFrom
:
fn try_from(v: u8) -> Result {
match v {
x if x == Handlers::Toggl as u8 => Ok(Handlers::Toggl),
x if x == Handlers::Clockify as u8 => Ok(Handlers::Clockify),
x if x == Handlers::Traggo as u8 => Ok(Handlers::Traggo),
x if x == Handlers::Hackaru as u8 => Ok(Handlers::Hackaru),
+ x if x == Handlers::Example as u8 => Ok(Handlers::Example),
_ => Err(()),
}
}
TryFrom<&String>
中相同:
fn try_from(v: &String) -> Result {
match v.as_str() {
"toggl" => Ok(Handlers::Toggl),
"clockify" => Ok(Handlers::Clockify),
"traggo" => Ok(Handlers::Traggo),
"hackaru" => Ok(Handlers::Hackaru),
+ "example" => Ok(Handlers::Example),
_ => Err(()),
}
}
最后要做的是调整工厂方法,在get_handler
中:
pub async fn get_handler(setup: bool, config: &TimeularConfig) -> Box {
match config.handler.as_str() {
"toggl" => Box::new(toggl::create_handler(setup).await),
"hackaru" => Box::new(hackaru::create_handler(setup).await),
"clockify" => Box::new(clockify::create_handler(setup).await),
"traggo" => Box::new(traggo::create_handler(setup).await),
+ "example" => Box::new(example::create_handler(setup).await),
_ => Box::new(example::create_handler(setup).await),
}
}
我已将示例跟踪器添加到存储库中,您可以在此基础上构建您的模块。
只需运行
cargo build